63
63
64
64
** 方法一:二分查找**
65
65
66
- 初始,判断数组首尾元素的大小关系,若 ` nums[0] <= nums[n - 1] ` ,说明当前数组已经是递增数组 ,最小值一定是数组第一个元素,提前返回 ` nums[0] ` 。
66
+ 初始,判断数组首尾元素的大小关系,若 ` nums[0] <= nums[n - 1] ` 条件成立,则说明当前数组已经是递增数组 ,最小值一定是数组第一个元素,提前返回 ` nums[0] ` 。
67
67
68
- 否则,进行二分判断。若 ` nums[0] <= nums[mid] ` ,说明 ` [left, mid] ` 范围内的元素构成递增数组,最小值一定在 mid 的右侧,否则说明 ` [mid + 1, right] ` 范围内的元素构成递增数组,最小值一定在 mid 的左侧。
68
+ 否则,进行二分判断。若 ` nums[0] <= nums[mid] ` ,说明 ` [left, mid] ` 范围内的元素构成递增数组,最小值一定在 ` mid ` 的右侧,否则说明 ` [mid + 1, right] ` 范围内的元素构成递增数组,最小值一定在 ` mid ` 的左侧。
69
69
70
- 时间复杂度 O(logn)。
70
+ ---
71
+
72
+ 除了 ` nums[0] ` ,也可以以 ` nums[right] ` 作为参照物,若 ` nums[mid] < nums[right] ` 成立,则最小值存在于 ` [left, mid] ` 范围当中,否则存在于 ` [mid + 1, right] ` 。
73
+
74
+ 时间复杂度:$O(logN)$
71
75
72
76
<!-- tabs:start -->
73
77
@@ -181,17 +185,17 @@ var findMin = function (nums) {
181
185
``` rust
182
186
impl Solution {
183
187
pub fn find_min (nums : Vec <i32 >) -> i32 {
184
- let mut l = 0 ;
185
- let mut r = nums . len () - 1 ;
186
- while l < r {
187
- let mid = l + (r - l ) / 2 ;
188
- if nums [mid ] > nums [r ] {
189
- l = mid + 1 ;
188
+ let mut left = 0 ;
189
+ let mut right = nums . len () - 1 ;
190
+ while left < right {
191
+ let mid = left + (right - left ) / 2 ;
192
+ if nums [mid ] > nums [right ] {
193
+ left = mid + 1 ;
190
194
} else {
191
- r = mid ;
195
+ right = mid ;
192
196
}
193
197
}
194
- nums [l ]
198
+ nums [left ]
195
199
}
196
200
}
197
201
```
@@ -200,15 +204,11 @@ impl Solution {
200
204
201
205
``` ts
202
206
function findMin(nums : number []): number {
203
- const n = nums .length ;
204
- if (nums [0 ] <= nums [n - 1 ]) {
205
- return nums [0 ];
206
- }
207
- let left = 0 ,
208
- right = n - 1 ;
207
+ let left = 0 ;
208
+ let right = nums .length - 1 ;
209
209
while (left < right ) {
210
- const mid = (left + right ) >> 1 ;
211
- if (nums [0 ] <= nums [mid ]) {
210
+ const mid = (left + right ) >>> 1 ;
211
+ if (nums [mid ] > nums [right ]) {
212
212
left = mid + 1 ;
213
213
} else {
214
214
right = mid ;
0 commit comments