Skip to content

Commit d20a267

Browse files
committed
feat: add solutions to lc problem: No.0455
No.0455.Assign Cookies
1 parent 72edb0e commit d20a267

File tree

8 files changed

+150
-89
lines changed

8 files changed

+150
-89
lines changed

Diff for: solution/0400-0499/0455.Assign Cookies/README.md

+59-31
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,18 @@
4747

4848
<!-- 这里可写通用的实现逻辑 -->
4949

50-
**方法一:排序 + 贪心**
50+
**方法一:排序 + 双指针**
5151

52-
时间复杂度 $O(mlogm+nlogn)$,其中 $m$ 表示 $g$ 的长度,$n$ 表示 $s$ 的长度。
52+
根据题目描述,我们应该优先将饼干分配给胃口值小的孩子,这样可以尽可能满足更多的孩子。
53+
54+
因此,我们首先对两个数组进行排序,然后用两个指针 $i$ 和 $j$ 分别指向数组 $g$ 和 $s$ 的头部,每次比较 $g[i]$ 和 $s[j]$ 的大小:
55+
56+
- 如果 $s[j] \lt g[i]$,说明当前饼干 $s[j]$ 无法满足当前孩子 $g[i]$,我们应该将尺寸更大的饼干分配给当前孩子,因此 $j$ 应该右移一位;如果 $j$ 越界,说明无法满足当前孩子,此时成功分配的孩子数量为 $i$,直接返回即可;
57+
- 如果 $s[j] \ge g[i]$,说明当前饼干 $s[j]$ 可以满足当前孩子 $g[i]$,我们将当前饼干分配给当前孩子,因此 $i$ 和 $j$ 都应该右移一位。
58+
59+
如果遍历完数组 $g$,则说明所有孩子都已经分配到饼干,则返回孩子总数即可。
60+
61+
时间复杂度 $O(m \times \log m + n \times \log n)$,空间复杂度 $O(\log m + \log n)$。其中 $m$ 和 $n$ 分别为数组 $g$ 和 $s$ 的长度。
5362

5463
<!-- tabs:start -->
5564

@@ -63,8 +72,8 @@ class Solution:
6372
g.sort()
6473
s.sort()
6574
j = 0
66-
for i, v in enumerate(g):
67-
while j < len(s) and s[j] < v:
75+
for i, x in enumerate(g):
76+
while j < len(s) and s[j] < g[i]:
6877
j += 1
6978
if j >= len(s):
7079
return i
@@ -81,17 +90,17 @@ class Solution {
8190
public int findContentChildren(int[] g, int[] s) {
8291
Arrays.sort(g);
8392
Arrays.sort(s);
84-
int i = 0, j = 0;
85-
for (; i < g.length; ++i) {
86-
while (j < s.length && s[j] < g[i]) {
93+
int m = g.length;
94+
int n = s.length;
95+
for (int i = 0, j = 0; i < m; ++i) {
96+
while (j < n && s[j] < g[i]) {
8797
++j;
8898
}
89-
if (j >= s.length) {
90-
break;
99+
if (j++ >= n) {
100+
return i;
91101
}
92-
++j;
93102
}
94-
return i;
103+
return m;
95104
}
96105
}
97106
```
@@ -104,17 +113,16 @@ public:
104113
int findContentChildren(vector<int>& g, vector<int>& s) {
105114
sort(g.begin(), g.end());
106115
sort(s.begin(), s.end());
107-
int i = 0, j = 0;
108-
for (; i < g.size(); ++i) {
109-
while (j < s.size() && s[j] < g[i]) {
116+
int m = g.size(), n = s.size();
117+
for (int i = 0, j = 0; i < m; ++i) {
118+
while (j < n && s[j] < g[i]) {
110119
++j;
111120
}
112-
if (j >= s.size()) {
113-
break;
121+
if (j++ >= n) {
122+
return i;
114123
}
115-
++j;
116124
}
117-
return i;
125+
return m;
118126
}
119127
};
120128
```
@@ -125,16 +133,17 @@ public:
125133
func findContentChildren(g []int, s []int) int {
126134
sort.Ints(g)
127135
sort.Ints(s)
128-
i, j := 0, 0
129-
for ; i < len(g); i++ {
130-
for ; j < len(s) && s[j] < g[i]; j++ {
136+
j := 0
137+
for i, x := range g {
138+
for j < len(s) && s[j] < x {
139+
j++
131140
}
132141
if j >= len(s) {
133-
break
142+
return i
134143
}
135144
j++
136145
}
137-
return i
146+
return len(g)
138147
}
139148
```
140149

@@ -149,21 +158,40 @@ func findContentChildren(g []int, s []int) int {
149158
var findContentChildren = function (g, s) {
150159
g.sort((a, b) => a - b);
151160
s.sort((a, b) => a - b);
152-
let i = 0;
153-
let j = 0;
154-
for (; i < g.length; ++i) {
155-
while (j < s.length && s[j] < g[i]) {
161+
const m = g.length;
162+
const n = s.length;
163+
for (let i = 0, j = 0; i < m; ++i) {
164+
while (j < n && s[j] < g[i]) {
156165
++j;
157166
}
158-
if (j >= s.length) {
159-
break;
167+
if (j++ >= n) {
168+
return i;
160169
}
161-
++j;
162170
}
163-
return i;
171+
return m;
164172
};
165173
```
166174

175+
### **TypeScript**
176+
177+
```ts
178+
function findContentChildren(g: number[], s: number[]): number {
179+
g.sort((a, b) => a - b);
180+
s.sort((a, b) => a - b);
181+
const m = g.length;
182+
const n = s.length;
183+
for (let i = 0, j = 0; i < m; ++i) {
184+
while (j < n && s[j] < g[i]) {
185+
++j;
186+
}
187+
if (j++ >= n) {
188+
return i;
189+
}
190+
}
191+
return m;
192+
}
193+
```
194+
167195
### **...**
168196

169197
```

Diff for: solution/0400-0499/0455.Assign Cookies/README_EN.md

+48-29
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,8 @@ class Solution:
5050
g.sort()
5151
s.sort()
5252
j = 0
53-
for i, v in enumerate(g):
54-
while j < len(s) and s[j] < v:
53+
for i, x in enumerate(g):
54+
while j < len(s) and s[j] < g[i]:
5555
j += 1
5656
if j >= len(s):
5757
return i
@@ -66,17 +66,17 @@ class Solution {
6666
public int findContentChildren(int[] g, int[] s) {
6767
Arrays.sort(g);
6868
Arrays.sort(s);
69-
int i = 0, j = 0;
70-
for (; i < g.length; ++i) {
71-
while (j < s.length && s[j] < g[i]) {
69+
int m = g.length;
70+
int n = s.length;
71+
for (int i = 0, j = 0; i < m; ++i) {
72+
while (j < n && s[j] < g[i]) {
7273
++j;
7374
}
74-
if (j >= s.length) {
75-
break;
75+
if (j++ >= n) {
76+
return i;
7677
}
77-
++j;
7878
}
79-
return i;
79+
return m;
8080
}
8181
}
8282
```
@@ -89,17 +89,16 @@ public:
8989
int findContentChildren(vector<int>& g, vector<int>& s) {
9090
sort(g.begin(), g.end());
9191
sort(s.begin(), s.end());
92-
int i = 0, j = 0;
93-
for (; i < g.size(); ++i) {
94-
while (j < s.size() && s[j] < g[i]) {
92+
int m = g.size(), n = s.size();
93+
for (int i = 0, j = 0; i < m; ++i) {
94+
while (j < n && s[j] < g[i]) {
9595
++j;
9696
}
97-
if (j >= s.size()) {
98-
break;
97+
if (j++ >= n) {
98+
return i;
9999
}
100-
++j;
101100
}
102-
return i;
101+
return m;
103102
}
104103
};
105104
```
@@ -110,16 +109,17 @@ public:
110109
func findContentChildren(g []int, s []int) int {
111110
sort.Ints(g)
112111
sort.Ints(s)
113-
i, j := 0, 0
114-
for ; i < len(g); i++ {
115-
for ; j < len(s) && s[j] < g[i]; j++ {
112+
j := 0
113+
for i, x := range g {
114+
for j < len(s) && s[j] < x {
115+
j++
116116
}
117117
if j >= len(s) {
118-
break
118+
return i
119119
}
120120
j++
121121
}
122-
return i
122+
return len(g)
123123
}
124124
```
125125

@@ -134,21 +134,40 @@ func findContentChildren(g []int, s []int) int {
134134
var findContentChildren = function (g, s) {
135135
g.sort((a, b) => a - b);
136136
s.sort((a, b) => a - b);
137-
let i = 0;
138-
let j = 0;
139-
for (; i < g.length; ++i) {
140-
while (j < s.length && s[j] < g[i]) {
137+
const m = g.length;
138+
const n = s.length;
139+
for (let i = 0, j = 0; i < m; ++i) {
140+
while (j < n && s[j] < g[i]) {
141141
++j;
142142
}
143-
if (j >= s.length) {
144-
break;
143+
if (j++ >= n) {
144+
return i;
145145
}
146-
++j;
147146
}
148-
return i;
147+
return m;
149148
};
150149
```
151150

151+
### **TypeScript**
152+
153+
```ts
154+
function findContentChildren(g: number[], s: number[]): number {
155+
g.sort((a, b) => a - b);
156+
s.sort((a, b) => a - b);
157+
const m = g.length;
158+
const n = s.length;
159+
for (let i = 0, j = 0; i < m; ++i) {
160+
while (j < n && s[j] < g[i]) {
161+
++j;
162+
}
163+
if (j++ >= n) {
164+
return i;
165+
}
166+
}
167+
return m;
168+
}
169+
```
170+
152171
### **...**
153172

154173
```

Diff for: solution/0400-0499/0455.Assign Cookies/Solution.cpp

+6-7
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,15 @@ class Solution {
33
int findContentChildren(vector<int>& g, vector<int>& s) {
44
sort(g.begin(), g.end());
55
sort(s.begin(), s.end());
6-
int i = 0, j = 0;
7-
for (; i < g.size(); ++i) {
8-
while (j < s.size() && s[j] < g[i]) {
6+
int m = g.size(), n = s.size();
7+
for (int i = 0, j = 0; i < m; ++i) {
8+
while (j < n && s[j] < g[i]) {
99
++j;
1010
}
11-
if (j >= s.size()) {
12-
break;
11+
if (j++ >= n) {
12+
return i;
1313
}
14-
++j;
1514
}
16-
return i;
15+
return m;
1716
}
1817
};

Diff for: solution/0400-0499/0455.Assign Cookies/Solution.go

+6-5
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
func findContentChildren(g []int, s []int) int {
22
sort.Ints(g)
33
sort.Ints(s)
4-
i, j := 0, 0
5-
for ; i < len(g); i++ {
6-
for ; j < len(s) && s[j] < g[i]; j++ {
4+
j := 0
5+
for i, x := range g {
6+
for j < len(s) && s[j] < x {
7+
j++
78
}
89
if j >= len(s) {
9-
break
10+
return i
1011
}
1112
j++
1213
}
13-
return i
14+
return len(g)
1415
}

Diff for: solution/0400-0499/0455.Assign Cookies/Solution.java

+7-7
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,16 @@ class Solution {
22
public int findContentChildren(int[] g, int[] s) {
33
Arrays.sort(g);
44
Arrays.sort(s);
5-
int i = 0, j = 0;
6-
for (; i < g.length; ++i) {
7-
while (j < s.length && s[j] < g[i]) {
5+
int m = g.length;
6+
int n = s.length;
7+
for (int i = 0, j = 0; i < m; ++i) {
8+
while (j < n && s[j] < g[i]) {
89
++j;
910
}
10-
if (j >= s.length) {
11-
break;
11+
if (j++ >= n) {
12+
return i;
1213
}
13-
++j;
1414
}
15-
return i;
15+
return m;
1616
}
1717
}

Diff for: solution/0400-0499/0455.Assign Cookies/Solution.js

+7-8
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,15 @@
66
var findContentChildren = function (g, s) {
77
g.sort((a, b) => a - b);
88
s.sort((a, b) => a - b);
9-
let i = 0;
10-
let j = 0;
11-
for (; i < g.length; ++i) {
12-
while (j < s.length && s[j] < g[i]) {
9+
const m = g.length;
10+
const n = s.length;
11+
for (let i = 0, j = 0; i < m; ++i) {
12+
while (j < n && s[j] < g[i]) {
1313
++j;
1414
}
15-
if (j >= s.length) {
16-
break;
15+
if (j++ >= n) {
16+
return i;
1717
}
18-
++j;
1918
}
20-
return i;
19+
return m;
2120
};

Diff for: solution/0400-0499/0455.Assign Cookies/Solution.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ def findContentChildren(self, g: List[int], s: List[int]) -> int:
33
g.sort()
44
s.sort()
55
j = 0
6-
for i, v in enumerate(g):
7-
while j < len(s) and s[j] < v:
6+
for i, x in enumerate(g):
7+
while j < len(s) and s[j] < g[i]:
88
j += 1
99
if j >= len(s):
1010
return i

0 commit comments

Comments
 (0)