455. Assign Cookies
原题:
Assume you are an awesome parent and want to give your children some
cookies. But, you should give each child at most one cookie. Each
child i has a greed factor gi, which is the minimum size of a cookie
that the child will be content with; and each cookie j has a size sj.
If sj >= gi, we can assign the cookie j to the child i, and the child
i will be content. Your goal is to maximize the number of your content
children and output the maximum number.Note: You may assume the greed factor is always positive. You cannot
assign more than one cookie to one child.
题意:
有一堆饼干和一堆孩子,每个饼干大小为s[j]
,每个孩子想要的大小为g[i]
,求这堆饼干能满足至多多少个孩子?
很容易想到,每个孩子尽量拿到和他想要的大小差距最小的饼干,就能保证不会“浪费”大块饼干。因此把g和s排序后,把最相邻的饼干分给刚刚好满足的孩子,就能得到最大的满足数量了。
class Solution {
public:
int findContentChildren(vector<int>& g, vector<int>& s) {
sort(g.begin(), g.end());
sort(s.begin(), s.end());
int i=0, j=0;
int count = 0;
for(; j<s.size() && i<g.size(); j++) {
if(g[i] <= s[j]) {
count ++;
i++;
}
}
return count;
}
};
452. Minimum Number of Arrows to Burst Balloons
原题:
There are a number of spherical balloons spread in two-dimensional
space. For each balloon, provided input is the start and end
coordinates of the horizontal diameter. Since it’s horizontal,
y-coordinates don’t matter and hence the x-coordinates of start and
end of the diameter suffice. Start is always smaller than end. There
will be at most 104 balloons.An arrow can be shot up exactly vertically from different points along
the x-axis. A balloon with xstart and xend bursts by an arrow shot at
x if xstart ≤ x ≤ xend. There is no limit to the number of arrows that
can be shot. An arrow once shot keeps travelling up infinitely. The
problem is to find the minimum number of arrows that must be shot to
burst all balloons.
题意:
二维的空中有一堆气球,每个气球的横向宽度为xstart
到xend
,现在在x轴垂直射出一支箭,问最多能射爆几个气球,x轴取值只能是整数。
假设这些气球投影在x轴,那么x轴上被投影数量最多的点,就是所求的答案。
先把这些气球排序,遍历一遍便知道该取的最大投影数。
代码:
class Solution {
public:
int findMinArrowShots(vector<pair<int, int>>& points) {
if(points.empty()) return 0;
//n*log(n)
sort(points.begin(),points.end(),cmp);
int arrows=1;
pair<int,int> p=points[0];
for(auto &pt:points) {
if(pt.first>p.second) {
p=pt;
arrows++;
}
else {
p.first=pt.first;
p.second=min(p.second,pt.second);
}
}
return arrows;
}
static bool cmp(pair<int,int> &a,pair<int,int> &b) {
return a.first<b.first||(a.first==b.first&&a.second<b.second);
}
};