题解 | #三色球#

三色球

http://www.nowcoder.com/practice/57328decf4734bdb8d8b68a324640806

三色球

问题描述:有红、黄、蓝三种颜色的气球。在牛客王国,1个红气球+1个黄气球+1个蓝气球可以兑换一张彩票。
2个红气球+1个黄气球可以兑换1个蓝气球。
2个黄气球+1个蓝气球可以兑换1个红气球。
2个蓝气球+1个红气球可以兑换1个黄气球。
现在牛牛有a个红气球,b个黄气球, c个蓝气球,牛牛想知道自己最多可以兑换多少张彩票。
示例
输入:1,7,5
返回值:3
说明:可以用4个黄气球和2个蓝气球换2个红气球,这样就有了3个红气球,3个黄气球,3个蓝气球,可以换3个彩票。

方法一

思路分析

      首先找到三种气球中数量最小的那一种,表示直接兑换彩票的数量,那么接下来必然会存在有一种颜色的气球数量为0,那么需要对剩下的气球先兑换不存在的气球,然后兑换彩票,将这一过程包装在一个函数中,不断的循环判断可以兑换的次数,即表示彩票数量,即存在下面三种情况:
  • 如果蓝气球数为0,则使用3个红气球+2个黄气球兑换一张彩票,在条件下,循环的次数,次数即为兑换彩票的张数;
  • 如果红气球数为0,则使用3个黄气球+2个蓝气球兑换一张彩票,条件下,循环的次数,次数即为兑换彩票的张数
  • 如果黄气球数为0,则使用3个蓝气球+2个红气球兑换一张彩票,条件下,循环的次数,次数即为兑换彩票的张数

C++核心代码

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 三色球
     * @param a int整型 
     * @param b int整型 
     * @param c int整型 
     * @return int整型
     */
    int  change(int m, int n){
        int count = 0;
        while (m > 0 && n > 0){
            m -= 3;//2个黄气球+1个蓝气球可以兑换1个红气球或者2个蓝气球+1个红气球可以兑换1个黄气球或者2个红气球+1个黄气球可以兑换1个蓝气球。
            n -= 2;
            if(m >= 0 && n >= 0){
                count++;
            }
        }
        return count;
    }
    int solve(int a, int b, int c) {
        // write code here
         int count = min(a,min(b,c));
        a -= count;//剩余的红气球
        b -= count;//剩余的黄气球
        c -= count;//剩余的蓝气球
        if(a == 0){
            return count + change(b,c);//红气球为0
        }else if (b == 0){
            return count  + change(c,a);//黄气球为0
        }else {
            return count + change(a,b);//蓝气球为0
        }
    }
};

复杂度分析

  • 时间复杂度:当一种颜色的气球数量为0时,需要进行兑换,兑换的时间复杂度主要产生于剩余气球的数量,因此时间复杂度为$O(max(a,b,c))$
  • 空间复杂度:常数空间,空间复杂度为$O(1)$

方法二

思路分析

题目中给定兑换方案如下:
  • 1个红气球+1个黄气球+1个蓝气球可以兑换一张彩票,首先找到三种气球中数量最小的那一种,表示直接兑换彩票的数量
  • 2个红气球+1个黄气球可以兑换1个蓝气球,那么使用3个红气球+2个黄气球可以兑换一张彩票
  • 2个黄气球+1个蓝气球可以兑换1个红气球,那么使用3个黄气球+2个蓝气球可以兑换一张彩票
  • 2个蓝气球+1个红气球可以兑换1个黄气球,那么使用3个蓝气球+2个红气球可以兑换一张彩票

具体过程如下:

  • m=min(a,b,c)表示直接兑换彩票的数量,三种气球中数量最小的那一种,表示直接兑换彩票的数量
  • 更新兑换后的各颜色的气球数量
  • 此时必然会存在一种气球的数量为0,此时分为三种情况如下:
  1. 如果蓝气球数为0,则使用3个红气球+2个黄气球兑换一张彩票,彩票数为min(a/3,b/2);
  2. 如果红气球数为0,则使用3个黄气球+2个蓝气球兑换一张彩票,彩票数为min(b/3,c/2);
  3. 如果黄气球数为0,则使用3个蓝气球+2个红气球兑换一张彩票,彩票数为min(c/3,a/2);

图解




Java核心代码

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 三色球
     * @param a int整型 
     * @param b int整型 
     * @param c int整型 
     * @return int整型
     */
    public int solve (int a, int b, int c) {
        // write code here
        int min = Math.min(a, Math.min(b, c));//1个红气球+1个黄气球+1个蓝气球可以兑换彩票数
        int ticket = min;
        a -= min;//剩余的红气球
        b -= min;//剩余的黄气球
        c -= min;//剩余的蓝气球
        if(a == 0){
            return ticket += Math.min(b/3, c/2);//2个黄气球+1个蓝气球可以兑换1个红气球
        }
        if(b == 0){
            return ticket += Math.min(c/3, a/2);//2个蓝气球+1个红气球可以兑换1个黄气球
        }
        if(c == 0){
            return ticket += Math.min(a/3, b/2);//2个红气球+1个黄气球可以兑换1个蓝气球。
        }
        return ticket;
    }
}

复杂度分析

  • 时间复杂度:常数时间,时间复杂度为$O(1)$
  • 空间复杂度:常数空间,空间复杂度为$O(1)$

全部评论

相关推荐

02-18 13:28
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
# 长得好看会提高面试通过率吗? #
4018次浏览 46人参与
# 离家近房租贵VS离家远但房租低,怎么选 #
16907次浏览 137人参与
# MiniMax求职进展汇总 #
25165次浏览 322人参与
# 春招至今,你的战绩如何? #
15816次浏览 145人参与
# 你的实习产出是真实的还是包装的? #
3098次浏览 53人参与
# 沪漂/北漂你觉得哪个更苦? #
1553次浏览 41人参与
# 米连集团26产品管培生项目 #
7310次浏览 226人参与
# HR最不可信的一句话是__ #
1091次浏览 32人参与
# AI面会问哪些问题? #
946次浏览 23人参与
# 你做过最难的笔试是哪家公司 #
1247次浏览 22人参与
# AI时代,哪个岗位还有“活路” #
2853次浏览 51人参与
# 不考虑薪资和职业,你最想做什么工作呢? #
152905次浏览 889人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
8021次浏览 43人参与
# XX请雇我工作 #
51155次浏览 171人参与
# 简历第一个项目做什么 #
32148次浏览 361人参与
# 简历中的项目经历要怎么写? #
311051次浏览 4265人参与
# 投格力的你,拿到offer了吗? #
178339次浏览 891人参与
# 你最满意的offer薪资是哪家公司? #
76981次浏览 375人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
187605次浏览 1123人参与
# AI时代,哪些岗位最容易被淘汰 #
64760次浏览 890人参与
# 如果重来一次你还会读研吗 #
230018次浏览 2011人参与
# 正在春招的你,也参与了去年秋招吗? #
364353次浏览 2642人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务