Assign Cookies
LeetCode: Assign Cookies
Problem:
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:
1. You may assume the greed factor is always positive.
2. You cannot assign more than one cookie to one child.
- Examples:
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.
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.
- Analysis:
For every child i, we give min(s[j] - g[i]) cookie, j: 0 ~ n.
- Code - Java:
class Solution {
public int findContentChildren(int[] g, int[] s) {
int lenG = g.length;
int lenS = s.length;
int result = 0;
Arrays.sort(g);
Arrays.sort(s);
int pos = 0;
for (int i = 0; i < lenG; i++) {
while (pos < lenS && s[pos] < g[i]) {
pos++;
}
if (pos == lenS) {
break;
}
result++;
pos++;
}
return result;
}
}
- Code - C++:
class Solution {
public:
int findContentChildren(vector<int>& g, vector<int>& s) {
int lenG = g.size();
int lenS = s.size();
int result = 0;
sort(g.begin(), g.end());
sort(s.begin(), s.end());
int pos = 0;
for (int i = 0; i < lenG; i++) {
while (pos < lenS && s[pos] < g[i]) {
pos++;
}
if (pos == lenS) {
break;
}
result++;
pos++;
}
return result;
}
};
- Code - Python:
class Solution(object):
def findContentChildren(self, g, s):
"""
:type g: List[int]
:type s: List[int]
:rtype: int
"""
lenG = len(g)
lenS = len(s)
g = sorted(g)
s = sorted(s)
pos = 0
result = 0
for i in range(lenG):
while pos < lenS and s[pos] < g[i]:
pos += 1
if pos == lenS:
break
result += 1
pos += 1
return result
Time Complexity: O(NLOGN), N is the length of input array s
Space Complexity: O(1)