61
61
62
62
<!-- 这里可写通用的实现逻辑 -->
63
63
64
- 二分查找。
64
+ ** 方法一: 二分查找**
65
65
66
- 若 ` nums[m] > nums[r] ` ,说明最小值在 m 的右边,否则说明最小值在 m 的左边(包括 m)。
66
+ 初始,判断数组首尾元素的大小关系,若 ` nums[0] <= nums[n - 1] ` ,说明当前数组已经是递增数组,最小值一定是数组第一个元素,提前返回 ` nums[0] ` 。
67
+
68
+ 否则,进行二分判断。若 ` nums[0] <= nums[mid] ` ,说明 ` [left, mid] ` 范围内的元素构成递增数组,最小值一定在 mid 的右侧,否则说明 ` [mid + 1, right] ` 范围内的元素构成递增数组,最小值一定在 mid 的左侧。
67
69
68
70
<!-- tabs:start -->
69
71
74
76
``` python
75
77
class Solution :
76
78
def findMin (self , nums : List[int ]) -> int :
77
- l, r = 0 , len (nums) - 1
78
- if nums[l] < nums[r]:
79
+ if nums[0 ] <= nums[- 1 ]:
79
80
return nums[0 ]
80
- while l < r:
81
- m = (l + r) >> 1
82
- if nums[m] > nums[r]:
83
- l = m + 1
81
+ left, right = 0 , len (nums) - 1
82
+ while left < right:
83
+ mid = (left + right) >> 1
84
+ if nums[0 ] <= nums[mid]:
85
+ left = mid + 1
84
86
else :
85
- r = m
86
- return nums[l ]
87
+ right = mid
88
+ return nums[left ]
87
89
```
88
90
89
91
### ** Java**
@@ -93,15 +95,20 @@ class Solution:
93
95
``` java
94
96
class Solution {
95
97
public int findMin (int [] nums ) {
96
- int l = 0 , r = nums. length - 1 ;
97
- // 说明是递增顺序,直接返回第一个元素
98
- if (nums[l] < nums[r]) return nums[0 ];
99
- while (l < r) {
100
- int m = (l + r) >>> 1 ;
101
- if (nums[m] > nums[r]) l = m + 1 ;
102
- else r = m;
98
+ int n = nums. length;
99
+ if (nums[0 ] <= nums[n - 1 ]) {
100
+ return nums[0 ];
101
+ }
102
+ int left = 0 , right = n - 1 ;
103
+ while (left < right) {
104
+ int mid = (left + right) >> 1 ;
105
+ if (nums[0 ] <= nums[mid]) {
106
+ left = mid + 1 ;
107
+ } else {
108
+ right = mid;
109
+ }
103
110
}
104
- return nums[l ];
111
+ return nums[left ];
105
112
}
106
113
}
107
114
```
@@ -112,14 +119,16 @@ class Solution {
112
119
class Solution {
113
120
public:
114
121
int findMin(vector<int >& nums) {
115
- int l = 0, r = nums.size() - 1;
116
- if (nums[ l] < nums[ r] ) return nums[ 0] ;
117
- while (l < r) {
118
- int m = (l + r) >> 1;
119
- if (nums[ m] > nums[ r] ) l = m + 1;
120
- else r = m;
122
+ int n = nums.size();
123
+ if (nums[ 0] <= nums[ n - 1] ) return nums[ 0] ;
124
+ int left = 0, right = n - 1;
125
+ while (left < right)
126
+ {
127
+ int mid = (left + right) >> 1;
128
+ if (nums[ 0] <= nums[ mid] ) left = mid + 1;
129
+ else right = mid;
121
130
}
122
- return nums[ l ] ;
131
+ return nums[ left ] ;
123
132
}
124
133
};
125
134
```
@@ -128,19 +137,20 @@ public:
128
137
129
138
```go
130
139
func findMin(nums []int) int {
131
- l, r := 0, len(nums) - 1
132
- if nums[l] < nums[r] {
133
- return nums[0]
134
- }
135
- for l < r {
136
- m := (l + r) >> 1
137
- if nums[m] > nums[r] {
138
- l = m + 1
139
- } else {
140
- r = m
141
- }
142
- }
143
- return nums[l]
140
+ n := len(nums)
141
+ if nums[0] <= nums[n-1] {
142
+ return nums[0]
143
+ }
144
+ left, right := 0, n-1
145
+ for left < right {
146
+ mid := (left + right) >> 1
147
+ if nums[0] <= nums[mid] {
148
+ left = mid + 1
149
+ } else {
150
+ right = mid
151
+ }
152
+ }
153
+ return nums[left]
144
154
}
145
155
```
146
156
@@ -184,6 +194,28 @@ impl Solution {
184
194
}
185
195
```
186
196
197
+ ### ** TypeScript**
198
+
199
+ ``` ts
200
+ function findMin(nums : number []): number {
201
+ const n = nums .length ;
202
+ if (nums [0 ] <= nums [n - 1 ]) {
203
+ return nums [0 ];
204
+ }
205
+ let left = 0 ,
206
+ right = n - 1 ;
207
+ while (left < right ) {
208
+ const mid = (left + right ) >> 1 ;
209
+ if (nums [0 ] <= nums [mid ]) {
210
+ left = mid + 1 ;
211
+ } else {
212
+ right = mid ;
213
+ }
214
+ }
215
+ return nums [left ];
216
+ }
217
+ ```
218
+
187
219
### ** ...**
188
220
189
221
```
0 commit comments