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

@代码随想录算法训练营第35天 | LeetCode860.柠檬水找零,406.根据身高重建队列,452. 用最少数量的箭引爆气球(学到了一些代码小知识)

860.柠檬水找零

第一遍读题思考

纯粹是分类讨论的问题,一共就三种付钱方式。。。

代码随想录解法思路

一样

c++代码具体实现注意事项

class Solution {
public:
    bool lemonadeChange(vector<int>& bills) {
        int hash[21];
        for(int i=0;i<bills.size();i++){
            if(bills[i]==10){
                if(--hash[5]<0){
                    return false;
                }
            }
            else if(bills[i]==20){
                if((hash[5]-1<0 || hash[10]-1<0)){
                    if(hash[5]-3<0){
                        return false;
                    }
                    else{
                        hash[5] -= 3;
                    }
                }
                else{
                    hash[5]--;
                    hash[10]--;
                }
            }
            hash[bills[i]]++;
        }
        return true;
    }
};

406.根据身高重建队列

第一遍读题思考

先按照第一个元素从大到小排个序,然后再考虑第二维度的排序。

代码随想录解法思路

先从大到小进行排序,这个可能比较好想,那第二个操作如何根据第二个维度构成最终的result呢?创建一个空的队列,然后从头遍历前面排好序的数组,根据每个数的第二维度来判断插入到que的哪一个位置,注意这里有一个关于queue的插入操作学习一下。

c++代码具体实现注意事项

注意看一下代码的实现,真的是能学到很多啊!

class Solution {
public:
    static bool cmp(vector<int> a, 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;
        for(int i=0;i<people.size();i++){
            int pos = people[i][1];
            std::list<vector<int>>::iterator it = que.begin();
            while(pos--){
                it++;
            }
            que.insert(it, people[i]);
        }
        return vector<vector<int>>(que.begin(), que.end());
    }
};

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

第一遍读题思考

难点在与怎么找到重叠最多的那一组气球。

代码随想录解法思路

用排序算法先按照左边界给从小到大排个序就行。

c++代码具体实现注意事项

注意cmp的bool函数定义的时候传入参数是“常量引用”,如果你直接用vector作为传入参数的时候函数要为实参创建副本,当数据量非常大的时候会导致时间超时,而用常量引用的时候函数在执行的时候不会为实参创建副本。

class Solution {
private:
    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];
    }
public:

    int findMinArrowShots(vector<vector<int>>& points) {
        if (points.size() == 0) return 0;
        sort(points.begin(), points.end(), cmp);
        int curRight=points[0][1];
        int result{1};
        for(int i=1;i<points.size();i++){
            if(points[i][0]>points[i-1][1]){
                result++;
            }
            else{
                points[i][1] = min(points[i][1], points[i-1][1]);
            }
        }
        return result;
    }
};

你可能感兴趣的:(算法)