Skip to content

Commit 99c462a

Browse files
committed
feat: add solutions to lc problem: No.1891
No.1891.Cutting Ribbons
1 parent 6051a97 commit 99c462a

File tree

10 files changed

+228
-170
lines changed

10 files changed

+228
-170
lines changed

solution/1100-1199/1137.N-th Tribonacci Number/README_EN.md

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,8 @@ T_4 = 1 + 1 + 2 = 4
4343
<p><strong>Constraints:</strong></p>
4444

4545
<ul>
46-
4746
<li><code>0 &lt;= n &lt;= 37</code></li>
48-
4947
<li>The answer is guaranteed to fit within a 32-bit integer, ie. <code>answer &lt;= 2^31 - 1</code>.</li>
50-
5148
</ul>
5249

5350
## Solutions

solution/1800-1899/1891.Cutting Ribbons/README.md

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

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

69-
“二分法”实现。
69+
**方法一:二分查找**
70+
71+
我们发现,如果我们能够得到长度为 $x$ 的 $k$ 根绳子,那么我们一定能够得到长度为 $x - 1$ 的 $k$ 根绳子,这存在着单调性。因此,我们可以使用二分查找的方法,找到最大的长度 $x$,使得我们能够得到长度为 $x$ 的 $k$ 根绳子。
72+
73+
我们定义二分查找的左边界 $left=0$, $right=10^5$,中间值 $mid=(left+right+1)/2$,然后计算当前长度为 $mid$ 的绳子能够得到的数量 $cnt$,如果 $cnt \geq k$,说明我们能够得到长度为 $mid$ 的 $k$ 根绳子,那么我们将 $left$ 更新为 $mid$,否则我们将 $right$ 更新为 $mid-1$。
74+
75+
最后,我们返回 $left$ 即可。
76+
77+
时间复杂度 $O(n \times \log M)$,空间复杂度 $O(1)$。其中 $n$ 和 $M$ 分别为绳子的数量和绳子的最大长度。
7078

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

@@ -77,17 +85,15 @@
7785
```python
7886
class Solution:
7987
def maxLength(self, ribbons: List[int], k: int) -> int:
80-
low, high = 0, 100000
81-
while low < high:
82-
mid = (low + high + 1) >> 1
83-
cnt = 0
84-
for ribbon in ribbons:
85-
cnt += ribbon // mid
86-
if cnt < k:
87-
high = mid - 1
88+
left, right = 0, 100000
89+
while left < right:
90+
mid = (left + right + 1) >> 1
91+
cnt = sum(x // mid for x in ribbons)
92+
if cnt >= k:
93+
left = mid
8894
else:
89-
low = mid
90-
return low
95+
right = mid - 1
96+
return left
9197
```
9298

9399
### **Java**
@@ -97,71 +103,44 @@ class Solution:
97103
```java
98104
class Solution {
99105
public int maxLength(int[] ribbons, int k) {
100-
int low = 0, high = 100000;
101-
while (low < high) {
102-
int mid = (low + high + 1) >> 1;
106+
int left = 0, right = 100000;
107+
while (left < right) {
108+
int mid = (left + right + 1) >>> 1;
103109
int cnt = 0;
104-
for (int ribbon : ribbons) {
105-
cnt += ribbon / mid;
110+
for (int x : ribbons) {
111+
cnt += x / mid;
106112
}
107-
if (cnt < k) {
108-
high = mid - 1;
113+
if (cnt >= k) {
114+
left = mid;
109115
} else {
110-
low = mid;
116+
right = mid - 1;
111117
}
112118
}
113-
return low;
119+
return left;
114120
}
115121
}
116122
```
117123

118-
### **JavaScript**
119-
120-
```js
121-
/**
122-
* @param {number[]} ribbons
123-
* @param {number} k
124-
* @return {number}
125-
*/
126-
var maxLength = function (ribbons, k) {
127-
let low = 0;
128-
let high = 100000;
129-
while (low < high) {
130-
const mid = (low + high + 1) >> 1;
131-
let cnt = 0;
132-
for (let ribbon of ribbons) {
133-
cnt += Math.floor(ribbon / mid);
134-
}
135-
if (cnt < k) {
136-
high = mid - 1;
137-
} else {
138-
low = mid;
139-
}
140-
}
141-
return low;
142-
};
143-
```
144-
145124
### **C++**
146125

147126
```cpp
148127
class Solution {
149128
public:
150129
int maxLength(vector<int>& ribbons, int k) {
151-
int low = 0, high = 100000;
152-
while (low < high) {
153-
int mid = (low + high + 1) / 2;
130+
int left = 0, right = 1e5;
131+
while (left < right) {
132+
int mid = (left + right + 1) >> 1;
154133
int cnt = 0;
155-
for (auto ribbon : ribbons) {
134+
for (int ribbon : ribbons) {
156135
cnt += ribbon / mid;
157136
}
158-
if (cnt < k) {
159-
high = mid - 1;
137+
if (cnt >= k) {
138+
left = mid;
160139
} else {
161-
low = mid;
140+
right = mid - 1;
162141
}
163142
}
164-
return low;
143+
return left;
165144
}
166145
};
167146
```
@@ -170,20 +149,69 @@ public:
170149
171150
```go
172151
func maxLength(ribbons []int, k int) int {
173-
low, high := 0, 100000
174-
for low < high {
175-
mid := (low + high + 1) >> 1
152+
left, right := 0, 100000
153+
for left < right {
154+
mid := (left + right + 1) >> 1
176155
cnt := 0
177-
for _, ribbon := range ribbons {
178-
cnt += ribbon / mid
156+
for _, x := range ribbons {
157+
cnt += x / mid
179158
}
180-
if cnt < k {
181-
high = mid - 1
159+
if cnt >= k {
160+
left = mid
182161
} else {
183-
low = mid
162+
right = mid - 1
184163
}
185164
}
186-
return low
165+
return left
166+
}
167+
```
168+
169+
### **JavaScript**
170+
171+
```js
172+
/**
173+
* @param {number[]} ribbons
174+
* @param {number} k
175+
* @return {number}
176+
*/
177+
var maxLength = function (ribbons, k) {
178+
let left = 0;
179+
let right = 1e5;
180+
while (left < right) {
181+
const mid = (left + right + 1) >> 1;
182+
let cnt = 0;
183+
for (const x of ribbons) {
184+
cnt += Math.floor(x / mid);
185+
}
186+
if (cnt >= k) {
187+
left = mid;
188+
} else {
189+
right = mid - 1;
190+
}
191+
}
192+
return left;
193+
};
194+
```
195+
196+
### **TypeScript**
197+
198+
```ts
199+
function maxLength(ribbons: number[], k: number): number {
200+
let left = 0;
201+
let right = 1e5;
202+
while (left < right) {
203+
const mid = (left + right + 1) >> 1;
204+
let cnt = 0;
205+
for (const x of ribbons) {
206+
cnt += Math.floor(x / mid);
207+
}
208+
if (cnt >= k) {
209+
left = mid;
210+
} else {
211+
right = mid - 1;
212+
}
213+
}
214+
return left;
187215
}
188216
```
189217

0 commit comments

Comments
 (0)