代码随想录第三十五天|Leetcode860.柠檬水找零、Leetcode406.根据身高重建队列、Leetcode452. 用最少数量的箭引爆气球

代码随想录第三十五天|Leetcode860.柠檬水找零、Leetcode406.根据身高重建队列、Leetcode452. 用最少数量的箭引爆气球

Leetcode860.柠檬水找零

写满了if,else的屎山,虽然是时间On,空间O1吧,但这ifelse我自己都觉得恶心

class Solution {
    
    
public:
    bool lemonadeChange(vector<int>& bills) {
    
    
        vector<int> dollars(2,0);
        for(int i=0;i<bills.size();i++){
    
    
            if(bills[i]==5) dollars[0]++;//给了个5
            else if(bills[i]==10){
    
    //给了个10
                dollars[0]--;
                if(dollars[0]<0) return false;
                dollars[1]++;
            }
            else{
    
    //给了个20
                if(dollars[1]>0){
    
    //有10块的
                    dollars[1]--;
                    dollars[0]--;
                    if(dollars[0]<0||dollars[1]<0) return false;
                }
                else{
    
    //只有五块的
                    dollars[0]-=3;
                    if(dollars[0]<0) return false;
                }
            }
        }
        return true;
    }
};

看了一眼答案,原来就是使用这个屎山,没事了

Leetcode406.根据身高重建队列

这个方法挺不错的,还可以改进一下用list,这样insert就变成O1级别了,vector的insert要On

class Solution {
    
    
public:
    // 身高从大到小排(身高相同k小的站前面)
    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);
        list<vector<int>> que; // list底层是链表实现,插入效率比vector高的多
        for (int i = 0; i < people.size(); i++) {
    
    
            int position = people[i][1]; // 插入到下标为position的位置
            list<vector<int>>::iterator it = que.begin();
            while (position--) {
    
     // 寻找在插入位置
                it++;
            }
            que.insert(it, people[i]);
        }
        return vector<vector<int>>(que.begin(), que.end());
    }
};

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

初期的想法想用贪心,让每支箭都射爆尽可能最多的气球,以换取最后使用箭数量最少。
那么就先排序,然后维护一个end,更新当前交集的尾巴,排序之后一下就有思路了。但是执行时间很长,不知道为啥

class Solution {
    
    
private:
    static bool cmp(vector<int>&a,vector<int>&b){
    
    
        if(a[0]==b[0]) return a[1]<b[1];
        return a[0]<b[0];
    }
public:
    int findMinArrowShots(vector<vector<int>>& points) {
    
    
        sort(points.begin(),points.end(),cmp);
        int end=points[0][1];
        int result=1;
        for(int cur=1;cur<points.size();cur++){
    
    
            if(points[cur][0]>end){
    
    
                end=points[cur][1];
                result++;
            }
            end=min(end,points[cur][1]);
        }
        return result;
    }
};

猜你喜欢

转载自blog.csdn.net/muzi_taibai/article/details/129371035