自学内容网 自学内容网

【刷题26】贪心—柠檬水找0、将数组和减半的最少操作次数、最大数

一、柠檬水找0

题目:
在这里插入图片描述

思路:

  • 分别用3个变量来充当5元、10元和20元张数的计数器
  • 如果数组的第一个不是5元,直接返回False
  • 遍历数组,是5元,five++
  • 是10元,five-1,ten++
  • 是20元,要尽可能保留多的5元,所以有10元就先用10元

代码:

class Solution {
public:
    bool lemonadeChange(vector<int>& bills) {
        if(bills[0] == 10 || bills[0] == 20) 
        {
            return false;
        }
        int five = 0, ten = 0, twenty = 0;
        for(auto& e : bills)
        {
            if(e == 5) five++;
            else if(e == 10)
            {
                five--;
                ten++;
            }
            else
            {
                if(ten > 0 && five > 0)
                {
                    ten--;
                    five--;
                    twenty++;
                }
                else if(five >= 3)
                {
                    five -= 3;
                    twenty++;
                }
                else return false;
            }
        }
        return true;
    }
};

二、将数组和减半的最少操作次数

题目:
在这里插入图片描述
思路:

  • 数组和计算出来,然后数组和减去数组中的最大元素的一半为一次操作,当数组和减到原来数组和的一半或者小于原来的一半,就返回操作次数
  • 用大堆放入数组元素

代码:

class Solution {
public:
    int halveArray(vector<int>& nums) {
        priority_queue<double> pq;
        double sum = 0;
        for(auto &e : nums) 
        {
            pq.push(e);
            sum += e;
        }
        double k = sum / 2.0;
        int ret = 0;
        while(sum > k)
        {
            double tmp = pq.top();
            tmp /= 2.0;
            pq.pop();
            pq.push(tmp);
            sum -= tmp;
            ret++;
        }
        return ret;
    }
};

三、最大数

题目:
在这里插入图片描述
思路:

  • ab > ba,a在前,b在后;ba > ab,b在前,a在后;相等顺序无所谓
  • 数组元素转换为字符串
  • 最后细节处理,如果第一个字符为0,就返回字符串0,因为后面一定是字符串0

代码:

class Solution {
public:
    string largestNumber(vector<int>& nums) {
        vector<string> strs;
        for(int i=0; i<nums.size(); i++)
        {
            string s = to_string(nums[i]);
            strs.push_back(s);
        }
        //
        sort(strs.begin(), strs.end(), [](string& s1, string& s2){
            return s1+s2 > s2+s1;
        });
        //
        string ret;
        for(auto& e : strs) ret += e;
        if(strs[0] == "0") return "0";
        return ret;
    }
};

原文地址:https://blog.csdn.net/2301_77459845/article/details/145192351

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!