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 g[i], which is the minimum size of a cookie that the child will be content with; and each cookie j has a size s[j]. If s[j] >= g[i], 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.
This question is same as below problem.
As duplicate - “2410 Maximum Matching of Players With Trainers”#
You are given a 0-indexed integer array players, where players[i] represents the ability of the ith player. You are also given a 0-indexed integer array trainers, where trainers[j] represents he training capacity of the jth trainer.
The ith player can match with the jth trainer if the player’s ability is less than or equal to the trainer’s training capacity. Additionally, the ith player can be matched with at most one trainer, and the jth trainer can be matched with at most one player.
Return _the maximum number of matchings between _playersandtrainersthat satisfy these conditions.
Input: g =[1,2,3], s =[1,1]Output: 1Explanation: 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 is1 content.You need to output 1.
Input: g =[1,2], s =[1,2,3]Output: 2Explanation: 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.
To maximize the number of matchings, we should try to match each player with the trainer who has the smallest sufficient training capacity. This preserves higher-capacity trainers for players who might need them.
classSolution {
public:int findContentChildren(vector<int>& g, vector<int>& s) {
sort(g.begin(), g.end());
sort(s.begin(), s.end());
int m = g.size(), n = s.size();
for (int i =0, j =0; i < m; ++i) {
while (j < n && s[j] < g[i]) {
++j;
}
if (j++>= n) {
return i;
}
}
return m;
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
funcfindContentChildren(g []int, s []int) int {
sort.Ints(g)
sort.Ints(s)
j:=0fori, x:=rangeg {
forj < len(s) &&s[j] < x {
j++ }
ifj>= len(s) {
returni }
j++ }
return len(g)
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
classSolution {
publicintfindContentChildren(int[] g, int[] s) {
Arrays.sort(g);
Arrays.sort(s);
int m = g.length;
int n = s.length;
for (int i = 0, j = 0; i < m; ++i) {
while (j < n && s[j]< g[i]) {
++j;
}
if (j++>= n) {
return i;
}
}
return m;
}
}