【代码随想录】30

4

2023年10月12日 - 贪心算法4

860. 柠檬水找零

 class Solution {
 public:
     bool lemonadeChange(vector<int>& bills) {
         int five = 0, ten = 0, twenty = 0;
         for (int bill : bills) {
             // 情况一
             if (bill == 5) five++;
             // 情况二
             if (bill == 10) {
                 if (five <= 0) return false;
                 ten++;
                 five--;
             }
             // 情况三
             if (bill == 20) {
                 // 优先消耗10美元,因为5美元的找零用处更大,能多留着就多留着
                 if (five > 0 && ten > 0) {
                     five--;
                     ten--;
                     twenty++; // 其实这行代码可以删了,因为记录20已经没有意义了,不会用20来找零
                 } else if (five >= 3) {
                     five -= 3;
                     twenty++; // 同理,这行代码也可以删了
                 } else return false;
             }
         }
         return true;
     }
 };

406. 根据身高重建队列

 class Solution {
 public:
     static bool cmp(const vector<int>& a, const vector<int>& b) {
         if (a[0] == b[0]) return a[1] < b[1];
         return a[0] > b[0];
     }
     vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
         sort (people.begin(), people.end(), cmp);
         vector<vector<int>> que;
         for (int i = 0; i < people.size(); i++) {
             int position = people[i][1];
             que.insert(que.begin() + position, people[i]);
         }
         return que;
     }
 };

452. 用最少数量的箭引爆气球

① 排序(左边界或者右边界)

② 不重叠结果+1,重叠更改第i个的右边界为最小值(进入下一个气球的判断)

 class Solution {
 private:
     static bool cmp(const vector<int>& a, const vector<int>& b) {
         return a[0] < b[0];
     }
 public:
     int findMinArrowShots(vector<vector<int>>& points) {
         if (points.size() == 0) return 0;
         sort(points.begin(), points.end(), cmp);
 ​
         int result = 1; // points 不为空至少需要一支箭
         for (int i = 1; i < points.size(); i++) {
             if (points[i][0] > points[i - 1][1]) {  // 气球i和气球i-1不挨着,注意这里不是>=
                 result++; // 需要一支箭
             }
             else {  // 气球i和气球i-1挨着
                 points[i][1] = min(points[i - 1][1], points[i][1]); // 更新重叠气球最小右边界
             }
         }
         return result;
     }
 };