首页 > 编程语言 >代码随想录算法训练营第三十四天| ● 860.柠檬水找零 ● 406.根据身高重建队列 ● 452. 用最少数量的箭引爆气球

代码随想录算法训练营第三十四天| ● 860.柠檬水找零 ● 406.根据身高重建队列 ● 452. 用最少数量的箭引爆气球

时间:2024-03-02 16:58:51浏览次数:28  
标签:return int 随想录 第三十四 找零 vector const 气球 points

柠檬水找零 

题目链接:860. 柠檬水找零 - 力扣(LeetCode)

思路:注意对于20元的情况,有两种找零方式,

                       

头一次见到这种情况,随便加一个标准输出才能通过的样例。

class Solution {
public:
    bool lemonadeChange(vector<int>& bills) {
        int l[2];
        for(int i=0;i<bills.size();i++){
            if(bills[i]==5){
                l[0]+=1;
            }
            else if(bills[i]==10){
                if(--l[0]<0)return false;
                l[1]+=1;
            }
            else{
                if(--l[0]<0){return false;}
                cout<<"";
                if(--l[1]<0){
                    ++l[1];
                    if(l[0]<2)return false;
                    else l[0]-=2;
                }           
            }
        }
        return true;
    }
};

 

根据身高重建队列 

题目链接:406. 根据身高重建队列 - 力扣(LeetCode)

思路:本题和分糖果有点类似,也是先处理一边再处理另一边。先从高到低按身高排序,接下来向队列里按顺序插入。注意高个子看不到低个子,低个子是比高个子更晚进入队列,因此不影响高个子。

class Solution {
public:
    vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
        sort(people.begin(), people.end(),
             [](const vector<int>& u, const vector<int>& v) {
                 return u[0] > v[0] || (u[0] == v[0] && u[1] < v[1]);
             });
        vector<vector<int>> ans;
        for (const vector<int>& person : people) {
            ans.insert(ans.begin() + person[1], person);
        }
        return ans;
    }
};

用最少数量的箭引爆气球 

题目链接:452. 用最少数量的箭引爆气球 - 力扣(LeetCode)

思路:重叠区间问题,首先用上一题学到的排序对区间进行从左到右排序,接下来不断更新重叠区间的起点和终点,每当遍历一个区间,都要更新起点,看情况是否更新终点。如果下一个区间的起点已经超出重叠区间的终点,则直接加一根箭,同时重新开始计算重叠区间。本质是排序加贪心。

注意:排序算法里要传递引用,否则会超时。

class Solution {
public:
    int findMinArrowShots(vector<vector<int>>& points) {
        sort(points.begin(),points.end(),[](const vector<int>&u,const vector<int>&v){
            return u[0]<v[0]||(u[0]==v[0]&&u[1]<v[1]);
        });
        int start=points[0][0];
        int end=points[0][1];
        int count=0;
        for(int i=0;i<points.size();i++){
            if(points[i][0]<=end){
                start=points[i][0];
                    if(end>=points[i][1])
                        end=points[i][1];
                continue;
            }
            ++count;
            start=points[i][0];
            end=points[i][1];
        }

        return count+1;
    }
};

这里放一种相同思路,但写法更优秀:

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;
    }
};

作者:代码随想录
链接:https://leetcode.cn/problems/minimum-number-of-arrows-to-burst-balloons/solutions/858320/dai-ma-sui-xiang-lu-dai-ni-xue-tou-tan-x-5wfl/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

标签:return,int,随想录,第三十四,找零,vector,const,气球,points
From: https://www.cnblogs.com/Liubox/p/18048823

相关文章