Skip to content

Commit a401602

Browse files
committed
feat: add solutions to lc problem: No.2064
No.2064.Minimized Maximum of Products Distributed to Any Store
1 parent 5708f0a commit a401602

File tree

7 files changed

+125
-141
lines changed

7 files changed

+125
-141
lines changed

solution/2000-2099/2064.Minimized Maximum of Products Distributed to Any Store/README.md

Lines changed: 53 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,15 @@
6666

6767
<!-- 这里可写通用的实现逻辑 -->
6868

69-
二分查找。
69+
**方法一:二分查找**
70+
71+
我们注意到,如果分配给任意商店商品数目的最大值为 $x$,且满足题目要求,那么 $x+1$ 也一定满足题目要求,这存在着单调性。因此我们可以通过二分查找,找到一个最小的 $x$,使得 $x$ 满足题目要求。
72+
73+
我们定义二分查找的左边界 $left=1$,右边界 $right=10^5$。对于二分查找的每一步,我们取中间值 $mid$,判断是否存在一个分配方案,使得分配给任意商店商品数目的最大值为 $mid$,如果存在,那么我们将右边界 $right$ 移动到 $mid$,否则将左边界 $left$ 移动到 $mid+1$。
74+
75+
二分查找结束后,答案即为 $left$。
76+
77+
时间复杂度 $O(m \times \log M)$,空间复杂度 $O(1)$。其中 $m$ 为商品种类数,而 $M$ 为商品数目的最大值,本题中 $M \leq 10^5$。
7078

7179
<!-- tabs:start -->
7280

@@ -77,15 +85,10 @@
7785
```python
7886
class Solution:
7987
def minimizedMaximum(self, n: int, quantities: List[int]) -> int:
80-
left, right = 1, int(1e5)
81-
while left < right:
82-
mid = (left + right) >> 1
83-
s = sum([(q + mid - 1) // mid for q in quantities])
84-
if s <= n:
85-
right = mid
86-
else:
87-
left = mid + 1
88-
return left
88+
def check(x):
89+
return sum((v + x - 1) // x for v in quantities) <= n
90+
91+
return 1 + bisect_left(range(1, 10**6), True, key=check)
8992
```
9093

9194
### **Java**
@@ -98,11 +101,11 @@ class Solution {
98101
int left = 1, right = (int) 1e5;
99102
while (left < right) {
100103
int mid = (left + right) >> 1;
101-
int s = 0;
102-
for (int q : quantities) {
103-
s += ((q + mid - 1) / mid);
104+
int cnt = 0;
105+
for (int v : quantities) {
106+
cnt += (v + mid - 1) / mid;
104107
}
105-
if (s <= n) {
108+
if (cnt <= n) {
106109
right = mid;
107110
} else {
108111
left = mid + 1;
@@ -113,28 +116,6 @@ class Solution {
113116
}
114117
```
115118

116-
### **TypeScript**
117-
118-
```ts
119-
function minimizedMaximum(n: number, quantities: number[]): number {
120-
let left = 1,
121-
right = 1e5;
122-
while (left < right) {
123-
const mid = (left + right) >> 1;
124-
let s = 0;
125-
for (let q of quantities) {
126-
s += Math.floor((q - 1) / mid) + 1;
127-
}
128-
if (s <= n) {
129-
right = mid;
130-
} else {
131-
left = mid + 1;
132-
}
133-
}
134-
return left;
135-
}
136-
```
137-
138119
### **C++**
139120

140121
```cpp
@@ -144,12 +125,15 @@ public:
144125
int left = 1, right = 1e5;
145126
while (left < right) {
146127
int mid = (left + right) >> 1;
147-
int s = 0;
148-
for (int& q : quantities) s += (q + mid - 1) / mid;
149-
if (s <= n)
128+
int cnt = 0;
129+
for (int& v : quantities) {
130+
cnt += (v + mid - 1) / mid;
131+
}
132+
if (cnt <= n) {
150133
right = mid;
151-
else
134+
} else {
152135
left = mid + 1;
136+
}
153137
}
154138
return left;
155139
}
@@ -160,20 +144,36 @@ public:
160144
161145
```go
162146
func minimizedMaximum(n int, quantities []int) int {
163-
left, right := 1, int(1e5)
164-
for left < right {
165-
mid := (left + right) >> 1
166-
s := 0
167-
for _, q := range quantities {
168-
s += (q + mid - 1) / mid
147+
return 1 + sort.Search(1e5, func(x int) bool {
148+
x++
149+
cnt := 0
150+
for _, v := range quantities {
151+
cnt += (v + x - 1) / x
169152
}
170-
if s <= n {
171-
right = mid
172-
} else {
173-
left = mid + 1
174-
}
175-
}
176-
return left
153+
return cnt <= n
154+
})
155+
}
156+
```
157+
158+
### **TypeScript**
159+
160+
```ts
161+
function minimizedMaximum(n: number, quantities: number[]): number {
162+
let left = 1;
163+
let right = 1e5;
164+
while (left < right) {
165+
const mid = (left + right) >> 1;
166+
let cnt = 0;
167+
for (const v of quantities) {
168+
cnt += Math.ceil(v / mid);
169+
}
170+
if (cnt <= n) {
171+
right = mid;
172+
} else {
173+
left = mid + 1;
174+
}
175+
}
176+
return left;
177177
}
178178
```
179179

solution/2000-2099/2064.Minimized Maximum of Products Distributed to Any Store/README_EN.md

Lines changed: 44 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -69,15 +69,10 @@ Binary search.
6969
```python
7070
class Solution:
7171
def minimizedMaximum(self, n: int, quantities: List[int]) -> int:
72-
left, right = 1, int(1e5)
73-
while left < right:
74-
mid = (left + right) >> 1
75-
s = sum([(q + mid - 1) // mid for q in quantities])
76-
if s <= n:
77-
right = mid
78-
else:
79-
left = mid + 1
80-
return left
72+
def check(x):
73+
return sum((v + x - 1) // x for v in quantities) <= n
74+
75+
return 1 + bisect_left(range(1, 10**6), True, key=check)
8176
```
8277

8378
### **Java**
@@ -88,11 +83,11 @@ class Solution {
8883
int left = 1, right = (int) 1e5;
8984
while (left < right) {
9085
int mid = (left + right) >> 1;
91-
int s = 0;
92-
for (int q : quantities) {
93-
s += ((q + mid - 1) / mid);
86+
int cnt = 0;
87+
for (int v : quantities) {
88+
cnt += (v + mid - 1) / mid;
9489
}
95-
if (s <= n) {
90+
if (cnt <= n) {
9691
right = mid;
9792
} else {
9893
left = mid + 1;
@@ -103,28 +98,6 @@ class Solution {
10398
}
10499
```
105100

106-
### **TypeScript**
107-
108-
```ts
109-
function minimizedMaximum(n: number, quantities: number[]): number {
110-
let left = 1,
111-
right = 1e5;
112-
while (left < right) {
113-
const mid = (left + right) >> 1;
114-
let s = 0;
115-
for (let q of quantities) {
116-
s += Math.floor((q - 1) / mid) + 1;
117-
}
118-
if (s <= n) {
119-
right = mid;
120-
} else {
121-
left = mid + 1;
122-
}
123-
}
124-
return left;
125-
}
126-
```
127-
128101
### **C++**
129102

130103
```cpp
@@ -134,12 +107,15 @@ public:
134107
int left = 1, right = 1e5;
135108
while (left < right) {
136109
int mid = (left + right) >> 1;
137-
int s = 0;
138-
for (int& q : quantities) s += (q + mid - 1) / mid;
139-
if (s <= n)
110+
int cnt = 0;
111+
for (int& v : quantities) {
112+
cnt += (v + mid - 1) / mid;
113+
}
114+
if (cnt <= n) {
140115
right = mid;
141-
else
116+
} else {
142117
left = mid + 1;
118+
}
143119
}
144120
return left;
145121
}
@@ -150,20 +126,36 @@ public:
150126
151127
```go
152128
func minimizedMaximum(n int, quantities []int) int {
153-
left, right := 1, int(1e5)
154-
for left < right {
155-
mid := (left + right) >> 1
156-
s := 0
157-
for _, q := range quantities {
158-
s += (q + mid - 1) / mid
159-
}
160-
if s <= n {
161-
right = mid
162-
} else {
163-
left = mid + 1
129+
return 1 + sort.Search(1e5, func(x int) bool {
130+
x++
131+
cnt := 0
132+
for _, v := range quantities {
133+
cnt += (v + x - 1) / x
164134
}
165-
}
166-
return left
135+
return cnt <= n
136+
})
137+
}
138+
```
139+
140+
### **TypeScript**
141+
142+
```ts
143+
function minimizedMaximum(n: number, quantities: number[]): number {
144+
let left = 1;
145+
let right = 1e5;
146+
while (left < right) {
147+
const mid = (left + right) >> 1;
148+
let cnt = 0;
149+
for (const v of quantities) {
150+
cnt += Math.ceil(v / mid);
151+
}
152+
if (cnt <= n) {
153+
right = mid;
154+
} else {
155+
left = mid + 1;
156+
}
157+
}
158+
return left;
167159
}
168160
```
169161

solution/2000-2099/2064.Minimized Maximum of Products Distributed to Any Store/Solution.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,15 @@ class Solution {
44
int left = 1, right = 1e5;
55
while (left < right) {
66
int mid = (left + right) >> 1;
7-
int s = 0;
8-
for (int& q : quantities) s += (q + mid - 1) / mid;
9-
if (s <= n)
7+
int cnt = 0;
8+
for (int& v : quantities) {
9+
cnt += (v + mid - 1) / mid;
10+
}
11+
if (cnt <= n) {
1012
right = mid;
11-
else
13+
} else {
1214
left = mid + 1;
15+
}
1316
}
1417
return left;
1518
}
Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,10 @@
11
func minimizedMaximum(n int, quantities []int) int {
2-
left, right := 1, int(1e5)
3-
for left < right {
4-
mid := (left + right) >> 1
5-
s := 0
6-
for _, q := range quantities {
7-
s += (q + mid - 1) / mid
2+
return 1 + sort.Search(1e5, func(x int) bool {
3+
x++
4+
cnt := 0
5+
for _, v := range quantities {
6+
cnt += (v + x - 1) / x
87
}
9-
if s <= n {
10-
right = mid
11-
} else {
12-
left = mid + 1
13-
}
14-
}
15-
return left
8+
return cnt <= n
9+
})
1610
}

solution/2000-2099/2064.Minimized Maximum of Products Distributed to Any Store/Solution.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ public int minimizedMaximum(int n, int[] quantities) {
33
int left = 1, right = (int) 1e5;
44
while (left < right) {
55
int mid = (left + right) >> 1;
6-
int s = 0;
7-
for (int q : quantities) {
8-
s += ((q + mid - 1) / mid);
6+
int cnt = 0;
7+
for (int v : quantities) {
8+
cnt += (v + mid - 1) / mid;
99
}
10-
if (s <= n) {
10+
if (cnt <= n) {
1111
right = mid;
1212
} else {
1313
left = mid + 1;
Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,6 @@
11
class Solution:
22
def minimizedMaximum(self, n: int, quantities: List[int]) -> int:
3-
left, right = 1, int(1e5)
4-
while left < right:
5-
mid = (left + right) >> 1
6-
s = sum([(q + mid - 1) // mid for q in quantities])
7-
if s <= n:
8-
right = mid
9-
else:
10-
left = mid + 1
11-
return left
3+
def check(x):
4+
return sum((v + x - 1) // x for v in quantities) <= n
5+
6+
return 1 + bisect_left(range(1, 10**6), True, key=check)

solution/2000-2099/2064.Minimized Maximum of Products Distributed to Any Store/Solution.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
function minimizedMaximum(n: number, quantities: number[]): number {
2-
let left = 1,
3-
right = 1e5;
2+
let left = 1;
3+
let right = 1e5;
44
while (left < right) {
55
const mid = (left + right) >> 1;
6-
let s = 0;
7-
for (let q of quantities) {
8-
s += Math.floor((q - 1) / mid) + 1;
6+
let cnt = 0;
7+
for (const v of quantities) {
8+
cnt += Math.ceil(v / mid);
99
}
10-
if (s <= n) {
10+
if (cnt <= n) {
1111
right = mid;
1212
} else {
1313
left = mid + 1;

0 commit comments

Comments
 (0)