70
70
71
71
我们发现,如果我们能够得到长度为 $x$ 的 $k$ 根绳子,那么我们一定能够得到长度为 $x - 1$ 的 $k$ 根绳子,这存在着单调性。因此,我们可以使用二分查找的方法,找到最大的长度 $x$,使得我们能够得到长度为 $x$ 的 $k$ 根绳子。
72
72
73
- 我们定义二分查找的左边界 $left=0$, $right=10^5 $,中间值 $mid=(left+right+1)/2$,然后计算当前长度为 $mid$ 的绳子能够得到的数量 $cnt$,如果 $cnt \geq k$,说明我们能够得到长度为 $mid$ 的 $k$ 根绳子,那么我们将 $left$ 更新为 $mid$,否则我们将 $right$ 更新为 $mid-1$。
73
+ 我们定义二分查找的左边界 $left=0$, $right=\max(ribbons) $,中间值 $mid=(left+right+1)/2$,然后计算当前长度为 $mid$ 的绳子能够得到的数量 $cnt$,如果 $cnt \geq k$,说明我们能够得到长度为 $mid$ 的 $k$ 根绳子,那么我们将 $left$ 更新为 $mid$,否则我们将 $right$ 更新为 $mid-1$。
74
74
75
75
最后,我们返回 $left$ 即可。
76
76
85
85
``` python
86
86
class Solution :
87
87
def maxLength (self , ribbons : List[int ], k : int ) -> int :
88
- left, right = 0 , 100000
88
+ left, right = 0 , max (ribbons)
89
89
while left < right:
90
90
mid = (left + right + 1 ) >> 1
91
91
cnt = sum (x // mid for x in ribbons)
@@ -103,7 +103,10 @@ class Solution:
103
103
``` java
104
104
class Solution {
105
105
public int maxLength (int [] ribbons , int k ) {
106
- int left = 0 , right = 100000 ;
106
+ int left = 0 , right = 0 ;
107
+ for (int x : ribbons) {
108
+ right = Math . max(right, x);
109
+ }
107
110
while (left < right) {
108
111
int mid = (left + right + 1 ) >>> 1 ;
109
112
int cnt = 0 ;
@@ -127,7 +130,7 @@ class Solution {
127
130
class Solution {
128
131
public:
129
132
int maxLength(vector<int >& ribbons, int k) {
130
- int left = 0, right = 1e5 ;
133
+ int left = 0, right = * max_element(ribbons.begin(), ribbons.end()) ;
131
134
while (left < right) {
132
135
int mid = (left + right + 1) >> 1;
133
136
int cnt = 0;
@@ -149,7 +152,10 @@ public:
149
152
150
153
```go
151
154
func maxLength(ribbons []int, k int) int {
152
- left, right := 0, 100000
155
+ left, right := 0, 0
156
+ for _, x := range ribbons {
157
+ right = max(right, x)
158
+ }
153
159
for left < right {
154
160
mid := (left + right + 1) >> 1
155
161
cnt := 0
@@ -164,6 +170,13 @@ func maxLength(ribbons []int, k int) int {
164
170
}
165
171
return left
166
172
}
173
+
174
+ func max(a, b int) int {
175
+ if a > b {
176
+ return a
177
+ }
178
+ return b
179
+ }
167
180
```
168
181
169
182
### ** JavaScript**
@@ -176,7 +189,7 @@ func maxLength(ribbons []int, k int) int {
176
189
*/
177
190
var maxLength = function (ribbons , k ) {
178
191
let left = 0 ;
179
- let right = 1e5 ;
192
+ let right = Math . max ( ... ribbons) ;
180
193
while (left < right) {
181
194
const mid = (left + right + 1 ) >> 1 ;
182
195
let cnt = 0 ;
@@ -198,7 +211,7 @@ var maxLength = function (ribbons, k) {
198
211
``` ts
199
212
function maxLength(ribbons : number [], k : number ): number {
200
213
let left = 0 ;
201
- let right = 1e5 ;
214
+ let right = Math . max ( ... ribbons ) ;
202
215
while (left < right ) {
203
216
const mid = (left + right + 1 ) >> 1 ;
204
217
let cnt = 0 ;
0 commit comments