66
66
67
67
<!-- 这里可写通用的实现逻辑 -->
68
68
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$ 分别为绳子的数量和绳子的最大长度。
70
78
71
79
<!-- tabs:start -->
72
80
77
85
``` python
78
86
class Solution :
79
87
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
88
94
else :
89
- low = mid
90
- return low
95
+ right = mid - 1
96
+ return left
91
97
```
92
98
93
99
### ** Java**
@@ -97,71 +103,44 @@ class Solution:
97
103
``` java
98
104
class Solution {
99
105
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 ;
103
109
int cnt = 0 ;
104
- for (int ribbon : ribbons) {
105
- cnt += ribbon / mid;
110
+ for (int x : ribbons) {
111
+ cnt += x / mid;
106
112
}
107
- if (cnt < k) {
108
- high = mid - 1 ;
113
+ if (cnt >= k) {
114
+ left = mid;
109
115
} else {
110
- low = mid;
116
+ right = mid - 1 ;
111
117
}
112
118
}
113
- return low ;
119
+ return left ;
114
120
}
115
121
}
116
122
```
117
123
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
-
145
124
### ** C++**
146
125
147
126
``` cpp
148
127
class Solution {
149
128
public:
150
129
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 ;
154
133
int cnt = 0;
155
- for (auto ribbon : ribbons) {
134
+ for (int ribbon : ribbons) {
156
135
cnt += ribbon / mid;
157
136
}
158
- if (cnt < k) {
159
- high = mid - 1 ;
137
+ if (cnt >= k) {
138
+ left = mid;
160
139
} else {
161
- low = mid;
140
+ right = mid - 1 ;
162
141
}
163
142
}
164
- return low ;
143
+ return left ;
165
144
}
166
145
};
167
146
```
@@ -170,20 +149,69 @@ public:
170
149
171
150
```go
172
151
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
176
155
cnt := 0
177
- for _, ribbon := range ribbons {
178
- cnt += ribbon / mid
156
+ for _, x := range ribbons {
157
+ cnt += x / mid
179
158
}
180
- if cnt < k {
181
- high = mid - 1
159
+ if cnt >= k {
160
+ left = mid
182
161
} else {
183
- low = mid
162
+ right = mid - 1
184
163
}
185
164
}
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 ;
187
215
}
188
216
```
189
217
0 commit comments