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