54
54
55
55
<!-- 这里可写通用的实现逻辑 -->
56
56
57
- 二分法。
57
+ ** 方法一:二分查找 **
58
58
59
- 若 ` nums[m ] > nums[r ] ` ,说明最小值在 m 的右边;若 ` nums[m ] < nums[r ] ` ,说明最小值在 m 的左边(包括 m );若相等,无法判断,直接将 r 减 1。循环比较。
59
+ 若 ` nums[mid ] > nums[right ] ` ,说明最小值在 mid 的右边;若 ` nums[mid ] < nums[right ] ` ,说明最小值在 mid 的左边(包括 mid );若相等,无法判断,直接将 right 减 1。循环比较。
60
60
61
- 最后返回 ` nums[l] ` 即可。
61
+ 最后返回 ` nums[left] ` 即可。
62
+
63
+ 时间复杂度 O(logn)。
62
64
63
65
<!-- tabs:start -->
64
66
69
71
``` python
70
72
class Solution :
71
73
def findMin (self , nums : List[int ]) -> int :
72
- l, r = 0 , len (nums) - 1
73
- while l < r :
74
- m = (l + r ) >> 1
75
- if nums[m ] > nums[r ]:
76
- l = m + 1
77
- elif nums[m ] < nums[r ]:
78
- r = m
74
+ left, right = 0 , len (nums) - 1
75
+ while left < right :
76
+ mid = (left + right ) >> 1
77
+ if nums[mid ] > nums[right ]:
78
+ left = mid + 1
79
+ elif nums[mid ] < nums[right ]:
80
+ right = mid
79
81
else :
80
- r -= 1
81
- return nums[l ]
82
+ right -= 1
83
+ return nums[left ]
82
84
```
83
85
84
86
### ** Java**
@@ -88,14 +90,18 @@ class Solution:
88
90
``` java
89
91
class Solution {
90
92
public int findMin (int [] nums ) {
91
- int l = 0 , r = nums. length - 1 ;
92
- while (l < r) {
93
- int m = (l + r) >>> 1 ;
94
- if (nums[m] > nums[r]) l = m + 1 ;
95
- else if (nums[m] < nums[r]) r = m;
96
- else -- r;
93
+ int left = 0 , right = nums. length - 1 ;
94
+ while (left < right) {
95
+ int mid = (left + right) >> 1 ;
96
+ if (nums[mid] > nums[right]) {
97
+ left = mid + 1 ;
98
+ } else if (nums[mid] < nums[right]) {
99
+ right = mid;
100
+ } else {
101
+ -- right;
102
+ }
97
103
}
98
- return nums[l ];
104
+ return nums[left ];
99
105
}
100
106
}
101
107
```
@@ -106,14 +112,15 @@ class Solution {
106
112
class Solution {
107
113
public:
108
114
int findMin(vector<int >& nums) {
109
- int l = 0, r = nums.size() - 1;
110
- while (l < r) {
111
- int m = (l + r) >> 1;
112
- if (nums[ m] > nums[ r] ) l = m + 1;
113
- else if (nums[ m] < nums[ r] ) r = m;
114
- else --r;
115
+ int left = 0, right = nums.size() - 1;
116
+ while (left < right)
117
+ {
118
+ int mid = (left + right) >> 1;
119
+ if (nums[ mid] > nums[ right] ) left = mid + 1;
120
+ else if (nums[ mid] < nums[ right] ) right = mid;
121
+ else --right;
115
122
}
116
- return nums[ l ] ;
123
+ return nums[ left ] ;
117
124
}
118
125
};
119
126
```
@@ -126,15 +133,19 @@ public:
126
133
* @return {number}
127
134
*/
128
135
var findMin = function (nums) {
129
- let l = 0,
130
- r = nums.length - 1;
131
- while (l < r) {
132
- const m = (l + r) >> 1;
133
- if (nums[m] > nums[r]) l = m + 1;
134
- else if (nums[m] < nums[r]) r = m;
135
- else --r;
136
+ let left = 0,
137
+ right = nums.length - 1;
138
+ while (left < right) {
139
+ const mid = (left + right) >> 1;
140
+ if (nums[mid] > nums[right]) {
141
+ left = mid + 1;
142
+ } else if (nums[mid] < nums[right]) {
143
+ right = mid;
144
+ } else {
145
+ --right;
146
+ }
136
147
}
137
- return nums[l ];
148
+ return nums[left ];
138
149
};
139
150
```
140
151
@@ -143,20 +154,37 @@ var findMin = function (nums) {
143
154
``` go
144
155
func findMin (nums []int ) int {
145
156
left , right := 0 , len (nums)-1
146
- for left+ 1 < right {
147
- mid := int ( uint ( left+ right) >> 1 )
157
+ for left < right {
158
+ mid := ( left + right) >> 1
148
159
if nums[mid] > nums[right] {
149
- left = mid
160
+ left = mid + 1
150
161
} else if nums[mid] < nums[right] {
151
162
right = mid
152
163
} else {
153
164
right--
154
165
}
155
166
}
156
- if nums[left] < nums[right] {
157
- return nums[left]
158
- }
159
- return nums[right]
167
+ return nums[left]
168
+ }
169
+ ```
170
+
171
+ ### ** TypeScript**
172
+
173
+ ``` ts
174
+ function findMin(nums : number []): number {
175
+ let left = 0 ,
176
+ right = nums .length - 1 ;
177
+ while (left < right ) {
178
+ const mid = (left + right ) >> 1 ;
179
+ if (nums [mid ] > nums [right ]) {
180
+ left = mid + 1 ;
181
+ } else if (nums [mid ] < nums [right ]) {
182
+ right = mid ;
183
+ } else {
184
+ -- right ;
185
+ }
186
+ }
187
+ return nums [left ];
160
188
}
161
189
```
162
190
0 commit comments