题目链接:860. 柠檬水找零 - 力扣(LeetCode)
class Solution
{
public:
bool lemonadeChange(vector<int> &bills)
{
int five=0;
int ten=0;
for(int i:bills){
if(i==5){
five++;
}else if(i==10){
five--;
ten++;
}else if(i==20&&ten>0){
ten--;
five--;
}else{
five-=3;
}
if(five<0) return false;
}
return true;
}
};
常识解题,没有任何思路。
题目链接:406. 根据身高重建队列 - 力扣(LeetCode)
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:
vector<vector<int>> reconstructQueue(vector<vector<int>> &people)
{
sort(people.begin(),people.end(),cmp);
vector<vector<int>> que;
for(int i=0;i<people.size();i++){
que.insert(que.begin()+people[i][1],people[i]);
}
return que;
}
};
有两个干扰排列的因素,就是有两个维度。我们要先解决其中一个在解决另一个,如果一起解决只会互相干扰。
那么我们先来排列身高,因为如果身高从大到小排好了,那么后面我们在对人数k进行排列,是按照遍历顺序先对高的人进行操作,然后矮的人可以顺理成章的按照人数插在高的前面或后面,因为高的人影响人数,矮的人不影响。
题目链接:452. 用最少数量的箭引爆气球 - 力扣(LeetCode)
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 arrow=1;
for (int i = 1; i < points.size(); i++)
{
if (points[i - 1][1] < points[i][0])
{
arrow++;
}else{
points[i][1]=min(points[i-1][1],points[i][1]);//右边界选小的,如果下一个可以和最小的那个凑一起那就不用给箭了
}
}
return arrow;
}
};
一个可以想到但是很模糊的思路。
根据左边的坐标排列好,然后对右边进行操作,判断右边的边界有没有概括下一个元素的左边界就知道有没有重复了。