LeetCode 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.
Example 1:
Input: [1,2,3], [1,1]
Output: 1
Explanation: You have 3 children and 2 cookies. The greed factors of 3 children are 1, 2, 3.
And even though you have 2 cookies, since their size is both 1, you could only make the child whose greed factor is 1 content.
You need to output 1.
Example 2:
Input: [1,2], [1,2,3]
Output: 2
Explanation: You have 2 children and 3 cookies. The greed factors of 2 children are 1, 2.
You have 3 cookies and their sizes are big enough to gratify all of the children,
You need to output 2.
解法一
思路
这题可以换个说法:对于两个数组A
和B
,求满足A[i] <= B[j]
的(i, j)
的最多数目。
这样就是一个典型的贪心问题了。不妨先把A
和B
都排序,然后从前往后遍历A
中元素A[i]
,并记录B
中当前位置j
(初始为0
),对于每个元素,从j
开始遍历B
中元素,当满足A[i] <= B[j]
时,记录此组合满足,并将j
增长1
(B[j]
不能重复用)。这个算法的关键点就在于对于A
中元素,在B
中查找时总是从j
开始,而且总是在第一个匹配时停下,可以手动模拟一下。
Python
class Solution:
def findContentChildren(self, g, s):
"""
:type g: List[int]
:type s: List[int]
:rtype: int
"""
g = sorted(g)
s = sorted(s)
i = 0
count = 0
for item in g:
while i < len(s) and item > s[i]:
i += 1
if i == len(s):
break
count += 1
i += 1
return count
Java
public class Solution {
public int findContentChildren(int[] g, int[] s) {
Arrays.sort(g);
Arrays.sort(s);
int i = 0;
int count = 0;
for (int item : g) {
while (i < s.length && item > s[i]) {
i++;
}
if (i == s.length) {
break;
}
count++;
i++;
}
return count;
}
}
C++
class Solution {
public:
int findContentChildren(vector<int> &g, vector<int> &s) {
sort(g.begin(), g.end());
sort(s.begin(), s.end());
int i = 0;
int count = 0;
for (auto item : g) {
while (i < s.size() && item > s[i]) {
i++;
}
if (i == s.size()) {
break;
}
count++;
i++;
}
return count;
}
};