本文大部分内容来自同名刷题题解,以及加上一些个人的理解与注释。
455.分发饼干
class Solution {
public:
int findContentChildren(vector<int>& g, vector<int>& s) {//child and cookie
sort(g.begin(),g.end());
sort(s.begin(),s.end());
int child = 0;
int cook = 0;
while(child < g.size()&&cook < s.size()){
if(g[child] <= s[cook])
child++;
cook++;
}
return child;
}
};
1)先对孩子的饥饿度和饼干大小排序
2)命令双指针进行大小排序,从最容易满足的孩子开始比较,直到饼干或者孩子比较完毕
135.分发糖果
class Solution {
public:
int candy(vector<int>& ratings) {
int size = ratings.size();
if(size < 2)
return size;
vector<int>candy1(size,1);//申请一个大小为size内容为1的vector数组
for(int i = 1;i < size;i++)
if(ratings[i] > ratings[i - 1])
candy1[i] = candy1[i - 1] + 1;;
for(int i = size - 1;i > 0;i--)
if(ratings[i] < ratings[i - 1] && candy1[i - 1] <= candy1[i])
candy1[i - 1] = candy1[i] + 1;
int sum = 0;
for(int i = 0;i < size;i++)
sum += candy1[i];
return sum;
}
};
进行两次遍历,由左到右时便将右元素与左元素比较,大则right = left + 1,由右到左则反之。
435.不重合区间
class Solution {
public:
int eraseOverlapIntervals(vector<vector<int>>& intervals) {
if(intervals.empty())
return 0;
sort(intervals.begin(),intervals.end(),[](vector<int> a,vector<int> b){
return a[1] < b[1];
});
int size = intervals.size();
int pre = intervals[0][1];
int cnt = 0;
for(int i = 1;i < size;i++)
if(intervals[i][0] < pre)//已经不能再放入重叠顺序里了,cnt++
cnt++;
else
pre = intervals[i][1];
return cnt;
}
};