Day35 | 860.柠檬水找零, 406.根据身高重建队列, 452. 用最少数量的箭引爆气球

Day35 | 860.柠檬水找零, 406.根据身高重建队列, 452. 用最少数量的箭引爆气球

柠檬水找零

LeetCode题目:https://leetcode.cn/problems/lemonade-change/

整体思路

  此题列出所有可能性的情况即可,因为只有三种纸币,很好列出。当一个纸币数量不满足要求时就可以返回false.

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

根据身高重建队列

LeetCode题目:https://leetcode.cn/problems/queue-reconstruction-by-height/

解题思路

  和糖果分配问题类似的理念,如果有两个需要思考的变量,可以先进行一种条件的全部满足进行实现。然后再对重组队列进行再次满足。

  在此题中,可以先将身高按照从高到低进行排列,如果身高相同,则后面要求的前方有大于等于自己身高的数量大的放在后面。在进行排列之后,可以根据每个元素的k值要求进行重构,即将位置插入到已经排列好的数组的指定位置。

  如何理解?已知当前身高从高到低进行的排列,所以如果后面的元素要在前面插入,前面元素的个数一定是后面元素k值的个数。因此,直接遍历并对每个元素插入k指定的位置不会产生异常。

  代码如下:

class Solution {
public:
    static bool compare(vector<int> a,vector<int> b){
        if(a[0]>b[0]){
            return true;
        }else if(a[0]==b[0]){
            return a[1]<b[1];
        }
        return false;
    }
    vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
        sort(people.begin(),people.end(),compare);
        list<vector<int>> queOne;
        for(int i=0;i<people.size();i++){
            int position = people[i][1];
            std::list<vector<int>>::iterator it = queOne.begin();
            while(position--){
                it++;
            }
            queOne.insert(it,people[i]);
        }
        return vector<vector<int>>(queOne.begin(),queOne.end());
    }
};

用最少数量的箭引爆气球

LeetCode题目:https://leetcode.cn/problems/minimum-number-of-arrows-to-burst-balloons/

解题思路

  覆盖问题对区间进行排列,并且对比前一个区间和后一个区间之间是否存在重叠区域即可。首先要进行依次排列,在对比。

  同时也要注意特殊情况,因为是对左区间做升序排列,所以如果右区间也大于下一个区间的右区间,则说明区间完全包含下一个区间,此时用下一个区间对后续进行重叠搜索即可,因此只要下一个区间满足的,本区间一定满足。

  代码如下:

class Solution {
public:
    static bool compare(const vector<int>& a,const vector<int>& b){
        if(a[0]<b[0]){
            return true;
        }else if(a[0]==b[0]){
            return a[1]<b[1];
        }
        return false;
    }
    int findMinArrowShots(vector<vector<int>>& points) {
        sort(points.begin(),points.end(),compare);
        int nums=1;
        int startIndex = 0;
        for(int i=1;i<points.size();i++){
            if(points[startIndex][1]>=points[i][0]){
                if(points[startIndex][1]>=points[i][1]){
                    startIndex = i;
                }
                continue;
            }
            nums++;
            startIndex = i;
        }
        return nums;
    }
};

你可能感兴趣的:(数据结构,算法,leetcode,c++)