Skip to content

Commit 61e1f92

Browse files
committed
feat: update solutions to lc problem: No.0154
No.0154.Find Minimum in Rotated Sorted Array II
1 parent aee3f41 commit 61e1f92

File tree

9 files changed

+216
-139
lines changed

9 files changed

+216
-139
lines changed

solution/0100-0199/0153.Find Minimum in Rotated Sorted Array/README.md

+2
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,8 @@
6767

6868
否则,进行二分判断。若 `nums[0] <= nums[mid]`,说明 `[left, mid]` 范围内的元素构成递增数组,最小值一定在 mid 的右侧,否则说明 `[mid + 1, right]`范围内的元素构成递增数组,最小值一定在 mid 的左侧。
6969

70+
时间复杂度 O(logn)。
71+
7072
<!-- tabs:start -->
7173

7274
### **Python3**

solution/0100-0199/0154.Find Minimum in Rotated Sorted Array II/README.md

+69-41
Original file line numberDiff line numberDiff line change
@@ -54,11 +54,13 @@
5454

5555
<!-- 这里可写通用的实现逻辑 -->
5656

57-
二分法。
57+
**方法一:二分查找**
5858

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。循环比较。
6060

61-
最后返回 `nums[l]` 即可。
61+
最后返回 `nums[left]` 即可。
62+
63+
时间复杂度 O(logn)。
6264

6365
<!-- tabs:start -->
6466

@@ -69,16 +71,16 @@
6971
```python
7072
class Solution:
7173
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
7981
else:
80-
r -= 1
81-
return nums[l]
82+
right -= 1
83+
return nums[left]
8284
```
8385

8486
### **Java**
@@ -88,14 +90,18 @@ class Solution:
8890
```java
8991
class Solution {
9092
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+
}
97103
}
98-
return nums[l];
104+
return nums[left];
99105
}
100106
}
101107
```
@@ -106,14 +112,15 @@ class Solution {
106112
class Solution {
107113
public:
108114
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;
115122
}
116-
return nums[l];
123+
return nums[left];
117124
}
118125
};
119126
```
@@ -126,15 +133,19 @@ public:
126133
* @return {number}
127134
*/
128135
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+
}
136147
}
137-
return nums[l];
148+
return nums[left];
138149
};
139150
```
140151

@@ -143,20 +154,37 @@ var findMin = function (nums) {
143154
```go
144155
func findMin(nums []int) int {
145156
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
148159
if nums[mid] > nums[right] {
149-
left = mid
160+
left = mid + 1
150161
} else if nums[mid] < nums[right] {
151162
right = mid
152163
} else {
153164
right--
154165
}
155166
}
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];
160188
}
161189
```
162190

solution/0100-0199/0154.Find Minimum in Rotated Sorted Array II/README_EN.md

+64-38
Original file line numberDiff line numberDiff line change
@@ -49,31 +49,35 @@
4949
```python
5050
class Solution:
5151
def findMin(self, nums: List[int]) -> int:
52-
l, r = 0, len(nums) - 1
53-
while l < r:
54-
m = (l + r) >> 1
55-
if nums[m] > nums[r]:
56-
l = m + 1
57-
elif nums[m] < nums[r]:
58-
r = m
52+
left, right = 0, len(nums) - 1
53+
while left < right:
54+
mid = (left + right) >> 1
55+
if nums[mid] > nums[right]:
56+
left = mid + 1
57+
elif nums[mid] < nums[right]:
58+
right = mid
5959
else:
60-
r -= 1
61-
return nums[l]
60+
right -= 1
61+
return nums[left]
6262
```
6363

6464
### **Java**
6565

6666
```java
6767
class Solution {
6868
public int findMin(int[] nums) {
69-
int l = 0, r = nums.length - 1;
70-
while (l < r) {
71-
int m = (l + r) >>> 1;
72-
if (nums[m] > nums[r]) l = m + 1;
73-
else if (nums[m] < nums[r]) r = m;
74-
else --r;
69+
int left = 0, right = nums.length - 1;
70+
while (left < right) {
71+
int mid = (left + right) >> 1;
72+
if (nums[mid] > nums[right]) {
73+
left = mid + 1;
74+
} else if (nums[mid] < nums[right]) {
75+
right = mid;
76+
} else {
77+
--right;
78+
}
7579
}
76-
return nums[l];
80+
return nums[left];
7781
}
7882
}
7983
```
@@ -84,14 +88,15 @@ class Solution {
8488
class Solution {
8589
public:
8690
int findMin(vector<int>& nums) {
87-
int l = 0, r = nums.size() - 1;
88-
while (l < r) {
89-
int m = (l + r) >> 1;
90-
if (nums[m] > nums[r]) l = m + 1;
91-
else if (nums[m] < nums[r]) r = m;
92-
else --r;
91+
int left = 0, right = nums.size() - 1;
92+
while (left < right)
93+
{
94+
int mid = (left + right) >> 1;
95+
if (nums[mid] > nums[right]) left = mid + 1;
96+
else if (nums[mid] < nums[right]) right = mid;
97+
else --right;
9398
}
94-
return nums[l];
99+
return nums[left];
95100
}
96101
};
97102
```
@@ -104,15 +109,19 @@ public:
104109
* @return {number}
105110
*/
106111
var findMin = function (nums) {
107-
let l = 0,
108-
r = nums.length - 1;
109-
while (l < r) {
110-
const m = (l + r) >> 1;
111-
if (nums[m] > nums[r]) l = m + 1;
112-
else if (nums[m] < nums[r]) r = m;
113-
else --r;
112+
let left = 0,
113+
right = nums.length - 1;
114+
while (left < right) {
115+
const mid = (left + right) >> 1;
116+
if (nums[mid] > nums[right]) {
117+
left = mid + 1;
118+
} else if (nums[mid] < nums[right]) {
119+
right = mid;
120+
} else {
121+
--right;
122+
}
114123
}
115-
return nums[l];
124+
return nums[left];
116125
};
117126
```
118127

@@ -121,20 +130,37 @@ var findMin = function (nums) {
121130
```go
122131
func findMin(nums []int) int {
123132
left, right := 0, len(nums)-1
124-
for left+1 < right {
125-
mid := int(uint(left+right) >> 1)
133+
for left < right {
134+
mid := (left + right) >> 1
126135
if nums[mid] > nums[right] {
127-
left = mid
136+
left = mid + 1
128137
} else if nums[mid] < nums[right] {
129138
right = mid
130139
} else {
131140
right--
132141
}
133142
}
134-
if nums[left] < nums[right] {
135-
return nums[left]
136-
}
137-
return nums[right]
143+
return nums[left]
144+
}
145+
```
146+
147+
### **TypeScript**
148+
149+
```ts
150+
function findMin(nums: number[]): number {
151+
let left = 0,
152+
right = nums.length - 1;
153+
while (left < right) {
154+
const mid = (left + right) >> 1;
155+
if (nums[mid] > nums[right]) {
156+
left = mid + 1;
157+
} else if (nums[mid] < nums[right]) {
158+
right = mid;
159+
} else {
160+
--right;
161+
}
162+
}
163+
return nums[left];
138164
}
139165
```
140166

Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
1-
class Solution {
2-
public:
3-
int findMin(vector<int>& nums) {
4-
int l = 0, r = nums.size() - 1;
5-
while (l < r) {
6-
int m = (l + r) >> 1;
7-
if (nums[m] > nums[r]) l = m + 1;
8-
else if (nums[m] < nums[r]) r = m;
9-
else --r;
10-
}
11-
return nums[l];
12-
}
1+
class Solution {
2+
public:
3+
int findMin(vector<int>& nums) {
4+
int left = 0, right = nums.size() - 1;
5+
while (left < right)
6+
{
7+
int mid = (left + right) >> 1;
8+
if (nums[mid] > nums[right]) left = mid + 1;
9+
else if (nums[mid] < nums[right]) right = mid;
10+
else --right;
11+
}
12+
return nums[left];
13+
}
1314
};
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,14 @@
1-
func findMin(nums []int) int {
2-
left, right := 0, len(nums)-1
3-
for left+1 < right {
4-
mid := int(uint(left+right) >> 1)
5-
if nums[mid] > nums[right] {
6-
left = mid
7-
} else if nums[mid] < nums[right] {
8-
right = mid
9-
} else {
10-
right--
11-
}
12-
}
13-
if nums[left] < nums[right] {
14-
return nums[left]
15-
}
16-
return nums[right]
17-
}
1+
func findMin(nums []int) int {
2+
left, right := 0, len(nums)-1
3+
for left < right {
4+
mid := (left + right) >> 1
5+
if nums[mid] > nums[right] {
6+
left = mid + 1
7+
} else if nums[mid] < nums[right] {
8+
right = mid
9+
} else {
10+
right--
11+
}
12+
}
13+
return nums[left]
14+
}

0 commit comments

Comments
 (0)