- 分发饼干
这题分配饼干的大小与小孩的饥饿程度有关,饥饿度更小的小孩更容易吃饱,所以考虑先满足饥饿度更小的小孩;首先对g和s排序,再从左往右遍历,当满足对应小孩时将饼干分配出去,不满足时找下一个饼干
class Solution {
public:
int findContentChildren(vector<int>& g, vector<int>& s) {
sort(g.begin(),g.end());
sort(s.begin(),s.end());
int child = 0;
int cookie = 0;
while(child < g.size()&& cookie < s.size())
{
if(g[child] <= s[cookie])
{
++child;
}
++cookie;
}
return child;
}
};
- 分发糖果
这题每个小孩至少分配到一个糖果,所以新分配一个初始化为1的数组表示每个小孩最小分配到的糖果数,首先从左往右找,如果后一个小孩的评分数比前一个更高,则将后一个小孩的糖果数加1;接着从右往左遍历,如果前一个小孩评分数比后一个更高,且前一个小孩的糖果数比后一个的少,则将前一个小孩的糖果数加1;最后直接用函数accumulate函数求糖果数总和。
class Solution {
public:
int candy(vector<int>& ratings)
{
int size = ratings.size();
if (size < 2)
{
return size;
}
vector<int> num(size, 1);//定义一个新数组初始化成1,表示每个孩子至少分到1个糖果
for (int i = 1; i < size; ++i)//从左往右遍历
{
if (ratings[i] > ratings[i-1]) //后一个小孩比前一个表现更好
{
num[i] = num[i-1] + 1;
}
}
for (int i = size - 1; i > 0; --i) //从右往左遍历
{
if (ratings[i] < ratings[i-1])
{
num[i-1] = max(num[i-1], num[i] + 1);
}
}
return accumulate(num.begin(),num.end(),0); //std::accumulate 可以很方便地求和
}
};
- 无重叠区间
class Solution {
public:
int eraseOverlapIntervals(vector<vector<int>>& intervals) {
if (intervals.empty())
{
return 0;
}
int n = intervals.size();
sort(intervals.begin(), intervals.end(), [](vector<int> a, vector<int> b) {return a[1] < b[1];});//对intervals排序
int total = 0, prev = intervals[0][1];
for (int i = 1; i < n; ++i)
{
if (intervals[i][0] < prev)
{
++total;
}
else
{
prev = intervals[i][1];
}
}
return total;
}
};