对于这种输入和应答的场景非常固定的问题,就直接硬写,贪心
class Solution {
public:
bool lemonadeChange(vector<int>& bills) {
unordered_map<int,int> money;
for(int i = 0;i< bills.size();i++){
int diff = bills[i] - 5;
if(diff == 0){
money[bills[i]]++;
continue;
}else if(diff == 5){
if(money[diff] != 0){
money[bills[i]]++;
money[diff]--;
continue;
}else{
return false;
}
}else if(diff == 15){
if(money[5] != 0 && money[10] != 0){
money[bills[i]]++;
money[5]--;
money[10]--;
continue;
}else if(money[5] >= 3 && money[10] == 0){
money[bills[i]]++;
money[5]--;
money[5]--;
money[5]--;
continue;
}else{
return false;
}
}
}
return true;
}
};
class Solution {
public:
static bool comp(const vector<int> & a,const vector<int> & b){
if(a[0] > b[0]){
return true;
}else if(a[0] == b[0]){
if(a[1] < b[1]){
return true;
}
}
return false;
}
vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
vector<vector<int>> queueVec;
sort(people.begin(),people.end(),comp);
for(int i = 0;i< people.size();i++){
queueVec.insert(queueVec.begin()+people[i][1],people[i]);
}
return queueVec;
}
};
对于这种元素需要考虑两个维度排序的问题(需要注意,这两个维度不一定是完全独立的),这个时候也应该一一考虑,先确定一个维度,然后在此基础上来确定下一个维度,先处理哪一个维度可以穷举模拟一下,看看排序确定以后效果如何,是否本维度可以确定下来,一般来说,如果两个维度有一定相关性,排序应该也要向另一个维度的语义靠拢
对于单个维度的排序处理,也是要在前一步操作的基础上排,确保不会把前面确定的结果给打乱
重叠区间问题:(尤其是需要对重叠区间内部处理的问题,比如一些统计重叠的区间或是删除重叠区间的问题)
- 先排序,按区间的起点排序,循环对每个排列好的区间顺序处理
- 假如cur区间的左边界小于等于pre区间的右边界,此时这就形成重叠区间,实际上这里的比较是前面的若干区间形成的重叠区间和新区间cur比较,看看能否归入重叠区间(这个若干区间形成的重叠区间的右边界需要每次和新加入的区间右边界取最小值min)
- 假如cur区间的左边界大于pre区间的右边界,则不构成重叠区间,重新开始构造
class Solution {
public:
static bool comp(const vector<int> & a,const vector<int> & b){
return a[0] < b[0];
}
int findMinArrowShots(vector<vector<int>>& points) {
int res = 1;
sort(points.begin(),points.end(),comp);
for(int i = 1;i< points.size();i++){
if(points[i-1][1] < points[i][0]){
res++;
}else{
points[i][1] = min(points[i-1][1],points[i][1]);
}
}
return res;
}
};