Skip to content

Commit 30206e2

Browse files
authored
feat: add solutions to lc problem: No.2226 (doocs#3759)
No.2226.Maximum Candies Allocated to K Children
1 parent eb8c6e7 commit 30206e2

File tree

7 files changed

+163
-116
lines changed

7 files changed

+163
-116
lines changed

solution/2200-2299/2226.Maximum Candies Allocated to K Children/README.md

+56-38
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,11 @@ tags:
6161

6262
### 方法一:二分查找
6363

64-
时间复杂度 $O(nlogn)$。
64+
我们注意到,如果每个小孩能分到糖果数 $v$,那么对于任意 $v' \lt v$,每个小孩也能分到 $v'$ 颗糖果。因此,我们可以使用二分查找的方法找到最大的 $v$,使得每个小孩能分到 $v$ 颗糖果。
65+
66+
我们定义二分查找的左边界 $l = 0$,右边界 $r = \max(\text{candies})$,其中 $\max(\text{candies})$ 表示数组 $\text{candies}$ 中的最大值。在二分查找的过程中,我们每次取 $v$ 的中间值 $v = \left\lfloor \frac{l + r + 1}{2} \right\rfloor$,然后计算每个小孩能分到的糖果数 $v$ 的总和,如果总和大于等于 $k$,则说明每个小孩能分到 $v$ 颗糖果,此时我们更新左边界 $l = v$,否则我们更新右边界 $r = v - 1$。最终,当 $l = r$ 时,我们找到了最大的 $v$。
67+
68+
时间复杂度 $O(n \times \log M)$,其中 $n$ 表示数组 $\text{candies}$ 的长度,而 $M$ 表示数组 $\text{candies}$ 中的最大值。空间复杂度 $O(1)$。
6569

6670
<!-- tabs:start -->
6771

@@ -70,36 +74,35 @@ tags:
7074
```python
7175
class Solution:
7276
def maximumCandies(self, candies: List[int], k: int) -> int:
73-
left, right = 0, max(candies)
74-
while left < right:
75-
mid = (left + right + 1) >> 1
76-
cnt = sum(v // mid for v in candies)
77-
if cnt >= k:
78-
left = mid
77+
l, r = 0, max(candies)
78+
while l < r:
79+
mid = (l + r + 1) >> 1
80+
if sum(x // mid for x in candies) >= k:
81+
l = mid
7982
else:
80-
right = mid - 1
81-
return left
83+
r = mid - 1
84+
return l
8285
```
8386

8487
#### Java
8588

8689
```java
8790
class Solution {
8891
public int maximumCandies(int[] candies, long k) {
89-
int left = 0, right = (int) 1e7;
90-
while (left < right) {
91-
int mid = (left + right + 1) >> 1;
92+
int l = 0, r = Arrays.stream(candies).max().getAsInt();
93+
while (l < r) {
94+
int mid = (l + r + 1) >> 1;
9295
long cnt = 0;
93-
for (int v : candies) {
94-
cnt += v / mid;
96+
for (int x : candies) {
97+
cnt += x / mid;
9598
}
9699
if (cnt >= k) {
97-
left = mid;
100+
l = mid;
98101
} else {
99-
right = mid - 1;
102+
r = mid - 1;
100103
}
101104
}
102-
return left;
105+
return l;
103106
}
104107
}
105108
```
@@ -110,17 +113,20 @@ class Solution {
110113
class Solution {
111114
public:
112115
int maximumCandies(vector<int>& candies, long long k) {
113-
int left = 0, right = 1e7;
114-
while (left < right) {
115-
int mid = (left + right + 1) >> 1;
116+
int l = 0, r = ranges::max(candies);
117+
while (l < r) {
118+
int mid = (l + r + 1) >> 1;
116119
long long cnt = 0;
117-
for (int& v : candies) cnt += v / mid;
118-
if (cnt >= k)
119-
left = mid;
120-
else
121-
right = mid - 1;
120+
for (int x : candies) {
121+
cnt += x / mid;
122+
}
123+
if (cnt >= k) {
124+
l = mid;
125+
} else {
126+
r = mid - 1;
127+
}
122128
}
123-
return left;
129+
return l;
124130
}
125131
};
126132
```
@@ -129,20 +135,32 @@ public:
129135
130136
```go
131137
func maximumCandies(candies []int, k int64) int {
132-
left, right := 0, int(1e7)
133-
for left < right {
134-
mid := (left + right + 1) >> 1
138+
return sort.Search(1e7, func(v int) bool {
139+
v++
135140
var cnt int64
136-
for _, v := range candies {
137-
cnt += int64(v / mid)
141+
for _, x := range candies {
142+
cnt += int64(x / v)
138143
}
139-
if cnt >= k {
140-
left = mid
141-
} else {
142-
right = mid - 1
143-
}
144-
}
145-
return left
144+
return cnt < k
145+
})
146+
}
147+
```
148+
149+
#### TypeScript
150+
151+
```ts
152+
function maximumCandies(candies: number[], k: number): number {
153+
let [l, r] = [0, Math.max(...candies)];
154+
while (l < r) {
155+
const mid = (l + r + 1) >> 1;
156+
const cnt = candies.reduce((acc, cur) => acc + Math.floor(cur / mid), 0);
157+
if (cnt >= k) {
158+
l = mid;
159+
} else {
160+
r = mid - 1;
161+
}
162+
}
163+
return l;
146164
}
147165
```
148166

solution/2200-2299/2226.Maximum Candies Allocated to K Children/README_EN.md

+58-38
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,13 @@ tags:
5656

5757
<!-- solution:start -->
5858

59-
### Solution 1
59+
### Solution 1: Binary Search
60+
61+
We notice that if each child can receive $v$ candies, then for any $v' \lt v$, each child can also receive $v'$ candies. Therefore, we can use binary search to find the maximum $v$ such that each child can receive $v$ candies.
62+
63+
We define the left boundary of the binary search as $l = 0$ and the right boundary as $r = \max(\text{candies})$, where $\max(\text{candies})$ represents the maximum value in the array $\text{candies}$. During the binary search, we take the middle value $v = \left\lfloor \frac{l + r + 1}{2} \right\rfloor$ each time, and then calculate the total number of candies each child can receive. If the total is greater than or equal to $k$, it means each child can receive $v$ candies, so we update the left boundary $l = v$. Otherwise, we update the right boundary $r = v - 1$. Finally, when $l = r$, we have found the maximum $v$.
64+
65+
The time complexity is $O(n \times \log M)$, where $n$ is the length of the array $\text{candies}$, and $M$ is the maximum value in the array $\text{candies}$. The space complexity is $O(1)$.
6066

6167
<!-- tabs:start -->
6268

@@ -65,36 +71,35 @@ tags:
6571
```python
6672
class Solution:
6773
def maximumCandies(self, candies: List[int], k: int) -> int:
68-
left, right = 0, max(candies)
69-
while left < right:
70-
mid = (left + right + 1) >> 1
71-
cnt = sum(v // mid for v in candies)
72-
if cnt >= k:
73-
left = mid
74+
l, r = 0, max(candies)
75+
while l < r:
76+
mid = (l + r + 1) >> 1
77+
if sum(x // mid for x in candies) >= k:
78+
l = mid
7479
else:
75-
right = mid - 1
76-
return left
80+
r = mid - 1
81+
return l
7782
```
7883

7984
#### Java
8085

8186
```java
8287
class Solution {
8388
public int maximumCandies(int[] candies, long k) {
84-
int left = 0, right = (int) 1e7;
85-
while (left < right) {
86-
int mid = (left + right + 1) >> 1;
89+
int l = 0, r = Arrays.stream(candies).max().getAsInt();
90+
while (l < r) {
91+
int mid = (l + r + 1) >> 1;
8792
long cnt = 0;
88-
for (int v : candies) {
89-
cnt += v / mid;
93+
for (int x : candies) {
94+
cnt += x / mid;
9095
}
9196
if (cnt >= k) {
92-
left = mid;
97+
l = mid;
9398
} else {
94-
right = mid - 1;
99+
r = mid - 1;
95100
}
96101
}
97-
return left;
102+
return l;
98103
}
99104
}
100105
```
@@ -105,17 +110,20 @@ class Solution {
105110
class Solution {
106111
public:
107112
int maximumCandies(vector<int>& candies, long long k) {
108-
int left = 0, right = 1e7;
109-
while (left < right) {
110-
int mid = (left + right + 1) >> 1;
113+
int l = 0, r = ranges::max(candies);
114+
while (l < r) {
115+
int mid = (l + r + 1) >> 1;
111116
long long cnt = 0;
112-
for (int& v : candies) cnt += v / mid;
113-
if (cnt >= k)
114-
left = mid;
115-
else
116-
right = mid - 1;
117+
for (int x : candies) {
118+
cnt += x / mid;
119+
}
120+
if (cnt >= k) {
121+
l = mid;
122+
} else {
123+
r = mid - 1;
124+
}
117125
}
118-
return left;
126+
return l;
119127
}
120128
};
121129
```
@@ -124,20 +132,32 @@ public:
124132
125133
```go
126134
func maximumCandies(candies []int, k int64) int {
127-
left, right := 0, int(1e7)
128-
for left < right {
129-
mid := (left + right + 1) >> 1
135+
return sort.Search(1e7, func(v int) bool {
136+
v++
130137
var cnt int64
131-
for _, v := range candies {
132-
cnt += int64(v / mid)
138+
for _, x := range candies {
139+
cnt += int64(x / v)
133140
}
134-
if cnt >= k {
135-
left = mid
136-
} else {
137-
right = mid - 1
138-
}
139-
}
140-
return left
141+
return cnt < k
142+
})
143+
}
144+
```
145+
146+
#### TypeScript
147+
148+
```ts
149+
function maximumCandies(candies: number[], k: number): number {
150+
let [l, r] = [0, Math.max(...candies)];
151+
while (l < r) {
152+
const mid = (l + r + 1) >> 1;
153+
const cnt = candies.reduce((acc, cur) => acc + Math.floor(cur / mid), 0);
154+
if (cnt >= k) {
155+
l = mid;
156+
} else {
157+
r = mid - 1;
158+
}
159+
}
160+
return l;
141161
}
142162
```
143163

Original file line numberDiff line numberDiff line change
@@ -1,16 +1,19 @@
11
class Solution {
22
public:
33
int maximumCandies(vector<int>& candies, long long k) {
4-
int left = 0, right = 1e7;
5-
while (left < right) {
6-
int mid = (left + right + 1) >> 1;
4+
int l = 0, r = ranges::max(candies);
5+
while (l < r) {
6+
int mid = (l + r + 1) >> 1;
77
long long cnt = 0;
8-
for (int& v : candies) cnt += v / mid;
9-
if (cnt >= k)
10-
left = mid;
11-
else
12-
right = mid - 1;
8+
for (int x : candies) {
9+
cnt += x / mid;
10+
}
11+
if (cnt >= k) {
12+
l = mid;
13+
} else {
14+
r = mid - 1;
15+
}
1316
}
14-
return left;
17+
return l;
1518
}
16-
};
19+
};
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,10 @@
11
func maximumCandies(candies []int, k int64) int {
2-
left, right := 0, int(1e7)
3-
for left < right {
4-
mid := (left + right + 1) >> 1
2+
return sort.Search(1e7, func(v int) bool {
3+
v++
54
var cnt int64
6-
for _, v := range candies {
7-
cnt += int64(v / mid)
5+
for _, x := range candies {
6+
cnt += int64(x / v)
87
}
9-
if cnt >= k {
10-
left = mid
11-
} else {
12-
right = mid - 1
13-
}
14-
}
15-
return left
16-
}
8+
return cnt < k
9+
})
10+
}
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
class Solution {
22
public int maximumCandies(int[] candies, long k) {
3-
int left = 0, right = (int) 1e7;
4-
while (left < right) {
5-
int mid = (left + right + 1) >> 1;
3+
int l = 0, r = Arrays.stream(candies).max().getAsInt();
4+
while (l < r) {
5+
int mid = (l + r + 1) >> 1;
66
long cnt = 0;
7-
for (int v : candies) {
8-
cnt += v / mid;
7+
for (int x : candies) {
8+
cnt += x / mid;
99
}
1010
if (cnt >= k) {
11-
left = mid;
11+
l = mid;
1212
} else {
13-
right = mid - 1;
13+
r = mid - 1;
1414
}
1515
}
16-
return left;
16+
return l;
1717
}
18-
}
18+
}
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
class Solution:
22
def maximumCandies(self, candies: List[int], k: int) -> int:
3-
left, right = 0, max(candies)
4-
while left < right:
5-
mid = (left + right + 1) >> 1
6-
cnt = sum(v // mid for v in candies)
7-
if cnt >= k:
8-
left = mid
3+
l, r = 0, max(candies)
4+
while l < r:
5+
mid = (l + r + 1) >> 1
6+
if sum(x // mid for x in candies) >= k:
7+
l = mid
98
else:
10-
right = mid - 1
11-
return left
9+
r = mid - 1
10+
return l
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
function maximumCandies(candies: number[], k: number): number {
2+
let [l, r] = [0, Math.max(...candies)];
3+
while (l < r) {
4+
const mid = (l + r + 1) >> 1;
5+
const cnt = candies.reduce((acc, cur) => acc + Math.floor(cur / mid), 0);
6+
if (cnt >= k) {
7+
l = mid;
8+
} else {
9+
r = mid - 1;
10+
}
11+
}
12+
return l;
13+
}

0 commit comments

Comments
 (0)