Skip to content

Commit e0839e0

Browse files
committed
feat: add solutions to lc problem: No.1760
No.1760.Minimum Limit of Balls in a Bag
1 parent 6ad792c commit e0839e0

File tree

7 files changed

+141
-102
lines changed

7 files changed

+141
-102
lines changed

solution/1700-1799/1760.Minimum Limit of Balls in a Bag/README.md

Lines changed: 50 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,8 @@
7272

7373
题目可以转换为:对某个开销值,看它能不能在 maxOperations 次操作内得到。二分枚举开销值,找到最小的开销值即可。
7474

75+
时间复杂度 $O(n \times \log M)$。其中 $n$ 和 $M$ 分别为数组 `nums` 的长度和最大值。
76+
7577
<!-- tabs:start -->
7678

7779
### **Python3**
@@ -81,15 +83,10 @@
8183
```python
8284
class Solution:
8385
def minimumSize(self, nums: List[int], maxOperations: int) -> int:
84-
left, right = 1, max(nums)
85-
while left < right:
86-
mid = (left + right) >> 1
87-
ops = sum((num - 1) // mid for num in nums)
88-
if ops <= maxOperations:
89-
right = mid
90-
else:
91-
left = mid + 1
92-
return left
86+
def f(x):
87+
return sum((v - 1) // x for v in nums) <= maxOperations
88+
89+
return bisect_left(range(1, max(nums) + 1), True, key=f) + 1
9390
```
9491

9592
### **Java**
@@ -102,11 +99,11 @@ class Solution {
10299
int left = 1, right = (int) 1e9;
103100
while (left < right) {
104101
int mid = (left + right) >>> 1;
105-
long ops = 0;
106-
for (int num : nums) {
107-
ops += (num - 1) / mid;
102+
long s = 0;
103+
for (int v : nums) {
104+
s += (v - 1) / mid;
108105
}
109-
if (ops <= maxOperations) {
106+
if (s <= maxOperations) {
110107
right = mid;
111108
} else {
112109
left = mid + 1;
@@ -123,15 +120,13 @@ class Solution {
123120
class Solution {
124121
public:
125122
int minimumSize(vector<int>& nums, int maxOperations) {
126-
int left = 1, right = 1e9;
123+
int left = 1, right = *max_element(nums.begin(), nums.end());
127124
while (left < right) {
128-
int mid = left + ((right - left) >> 1);
129-
long long ops = 0;
130-
for (int num : nums) ops += (num - 1) / mid;
131-
if (ops <= maxOperations)
132-
right = mid;
133-
else
134-
left = mid + 1;
125+
int mid = left + right >> 1;
126+
long s = 0;
127+
for (int v : nums) s += (v - 1) / mid;
128+
if (s <= maxOperations) right = mid;
129+
else left = mid + 1;
135130
}
136131
return left;
137132
}
@@ -142,23 +137,44 @@ public:
142137
143138
```go
144139
func minimumSize(nums []int, maxOperations int) int {
145-
left, right := 1, int(1e9)
146-
for left < right {
147-
mid := (left + right) >> 1
148-
var ops int
149-
for _, num := range nums {
150-
ops += (num - 1) / mid
151-
}
152-
if ops <= maxOperations {
153-
right = mid
154-
} else {
155-
left = mid + 1
140+
return 1 + sort.Search(1e9, func(x int) bool {
141+
x++
142+
s := 0
143+
for _, v := range nums {
144+
s += (v - 1) / x
156145
}
157-
}
158-
return left
146+
return s <= maxOperations
147+
})
159148
}
160149
```
161150

151+
### **JavaScript**
152+
153+
```js
154+
/**
155+
* @param {number[]} nums
156+
* @param {number} maxOperations
157+
* @return {number}
158+
*/
159+
var minimumSize = function (nums, maxOperations) {
160+
let left = 1;
161+
let right = 1e9;
162+
while (left < right) {
163+
const mid = (left + right) >> 1;
164+
let s = 0;
165+
for (const v of nums) {
166+
s += Math.floor((v - 1) / mid);
167+
}
168+
if (s <= maxOperations) {
169+
right = mid;
170+
} else {
171+
left = mid + 1;
172+
}
173+
}
174+
return left;
175+
};
176+
```
177+
162178
### **...**
163179

164180
```

solution/1700-1799/1760.Minimum Limit of Balls in a Bag/README_EN.md

Lines changed: 48 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -64,15 +64,10 @@ Binary search.
6464
```python
6565
class Solution:
6666
def minimumSize(self, nums: List[int], maxOperations: int) -> int:
67-
left, right = 1, max(nums)
68-
while left < right:
69-
mid = (left + right) >> 1
70-
ops = sum((num - 1) // mid for num in nums)
71-
if ops <= maxOperations:
72-
right = mid
73-
else:
74-
left = mid + 1
75-
return left
67+
def f(x):
68+
return sum((v - 1) // x for v in nums) <= maxOperations
69+
70+
return bisect_left(range(1, max(nums) + 1), True, key=f) + 1
7671
```
7772

7873
### **Java**
@@ -83,11 +78,11 @@ class Solution {
8378
int left = 1, right = (int) 1e9;
8479
while (left < right) {
8580
int mid = (left + right) >>> 1;
86-
long ops = 0;
87-
for (int num : nums) {
88-
ops += (num - 1) / mid;
81+
long s = 0;
82+
for (int v : nums) {
83+
s += (v - 1) / mid;
8984
}
90-
if (ops <= maxOperations) {
85+
if (s <= maxOperations) {
9186
right = mid;
9287
} else {
9388
left = mid + 1;
@@ -104,15 +99,13 @@ class Solution {
10499
class Solution {
105100
public:
106101
int minimumSize(vector<int>& nums, int maxOperations) {
107-
int left = 1, right = 1e9;
102+
int left = 1, right = *max_element(nums.begin(), nums.end());
108103
while (left < right) {
109-
int mid = left + ((right - left) >> 1);
110-
long long ops = 0;
111-
for (int num : nums) ops += (num - 1) / mid;
112-
if (ops <= maxOperations)
113-
right = mid;
114-
else
115-
left = mid + 1;
104+
int mid = left + right >> 1;
105+
long s = 0;
106+
for (int v : nums) s += (v - 1) / mid;
107+
if (s <= maxOperations) right = mid;
108+
else left = mid + 1;
116109
}
117110
return left;
118111
}
@@ -123,23 +116,44 @@ public:
123116
124117
```go
125118
func minimumSize(nums []int, maxOperations int) int {
126-
left, right := 1, int(1e9)
127-
for left < right {
128-
mid := (left + right) >> 1
129-
var ops int
130-
for _, num := range nums {
131-
ops += (num - 1) / mid
119+
return 1 + sort.Search(1e9, func(x int) bool {
120+
x++
121+
s := 0
122+
for _, v := range nums {
123+
s += (v - 1) / x
132124
}
133-
if ops <= maxOperations {
134-
right = mid
135-
} else {
136-
left = mid + 1
137-
}
138-
}
139-
return left
125+
return s <= maxOperations
126+
})
140127
}
141128
```
142129

130+
### **JavaScript**
131+
132+
```js
133+
/**
134+
* @param {number[]} nums
135+
* @param {number} maxOperations
136+
* @return {number}
137+
*/
138+
var minimumSize = function (nums, maxOperations) {
139+
let left = 1;
140+
let right = 1e9;
141+
while (left < right) {
142+
const mid = (left + right) >> 1;
143+
let s = 0;
144+
for (const v of nums) {
145+
s += Math.floor((v - 1) / mid);
146+
}
147+
if (s <= maxOperations) {
148+
right = mid;
149+
} else {
150+
left = mid + 1;
151+
}
152+
}
153+
return left;
154+
};
155+
```
156+
143157
### **...**
144158

145159
```

solution/1700-1799/1760.Minimum Limit of Balls in a Bag/Solution.cpp

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,13 @@
11
class Solution {
22
public:
33
int minimumSize(vector<int>& nums, int maxOperations) {
4-
int left = 1, right = 1e9;
4+
int left = 1, right = *max_element(nums.begin(), nums.end());
55
while (left < right) {
6-
int mid = left + ((right - left) >> 1);
7-
long long ops = 0;
8-
for (int num : nums) ops += (num - 1) / mid;
9-
if (ops <= maxOperations)
10-
right = mid;
11-
else
12-
left = mid + 1;
6+
int mid = left + right >> 1;
7+
long s = 0;
8+
for (int v : nums) s += (v - 1) / mid;
9+
if (s <= maxOperations) right = mid;
10+
else left = mid + 1;
1311
}
1412
return left;
1513
}
Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,10 @@
11
func minimumSize(nums []int, maxOperations int) int {
2-
left, right := 1, int(1e9)
3-
for left < right {
4-
mid := (left + right) >> 1
5-
var ops int
6-
for _, num := range nums {
7-
ops += (num - 1) / mid
2+
return 1 + sort.Search(1e9, func(x int) bool {
3+
x++
4+
s := 0
5+
for _, v := range nums {
6+
s += (v - 1) / x
87
}
9-
if ops <= maxOperations {
10-
right = mid
11-
} else {
12-
left = mid + 1
13-
}
14-
}
15-
return left
8+
return s <= maxOperations
9+
})
1610
}

solution/1700-1799/1760.Minimum Limit of Balls in a Bag/Solution.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ public int minimumSize(int[] nums, int maxOperations) {
33
int left = 1, right = (int) 1e9;
44
while (left < right) {
55
int mid = (left + right) >>> 1;
6-
long ops = 0;
7-
for (int num : nums) {
8-
ops += (num - 1) / mid;
6+
long s = 0;
7+
for (int v : nums) {
8+
s += (v - 1) / mid;
99
}
10-
if (ops <= maxOperations) {
10+
if (s <= maxOperations) {
1111
right = mid;
1212
} else {
1313
left = mid + 1;
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/**
2+
* @param {number[]} nums
3+
* @param {number} maxOperations
4+
* @return {number}
5+
*/
6+
var minimumSize = function (nums, maxOperations) {
7+
let left = 1;
8+
let right = 1e9;
9+
while (left < right) {
10+
const mid = (left + right) >> 1;
11+
let s = 0;
12+
for (const v of nums) {
13+
s += Math.floor((v - 1) / mid);
14+
}
15+
if (s <= maxOperations) {
16+
right = mid;
17+
} else {
18+
left = mid + 1;
19+
}
20+
}
21+
return left;
22+
};
Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,6 @@
11
class Solution:
22
def minimumSize(self, nums: List[int], maxOperations: int) -> int:
3-
left, right = 1, max(nums)
4-
while left < right:
5-
mid = (left + right) >> 1
6-
ops = sum((num - 1) // mid for num in nums)
7-
if ops <= maxOperations:
8-
right = mid
9-
else:
10-
left = mid + 1
11-
return left
3+
def f(x):
4+
return sum((v - 1) // x for v in nums) <= maxOperations
5+
6+
return bisect_left(range(1, max(nums) + 1), True, key=f) + 1

0 commit comments

Comments
 (0)