Skip to content

Commit 5299f47

Browse files
committed
feat: add solutions to lc problem: No.0153
No.0153.Find Minimum in Rotated Sorted Array
1 parent 87bc379 commit 5299f47

File tree

9 files changed

+226
-131
lines changed

9 files changed

+226
-131
lines changed

solution/0000-0099/0033.Search in Rotated Sorted Array/README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@
6767
- 若满足 `nums[mid] < target <= nums[n - 1]`,那么我们搜索范围可以缩小为 `[mid + 1, right]`
6868
- 否则,在 `[left, mid]` 中查找。
6969

70-
二分查找终止条件是 `l >= r`,若结束后发现 `nums[left]``target` 不等,说明数组中不存在值为 `target` 的元素,返回 -1,否则返回下标 left。
70+
二分查找终止条件是 `left >= right`,若结束后发现 `nums[left]``target` 不等,说明数组中不存在值为 `target` 的元素,返回 -1,否则返回下标 left。
7171

7272
<!-- tabs:start -->
7373

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

+70-38
Original file line numberDiff line numberDiff line change
@@ -61,9 +61,11 @@
6161

6262
<!-- 这里可写通用的实现逻辑 -->
6363

64-
二分查找
64+
**方法一:二分查找**
6565

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 的左侧。
6769

6870
<!-- tabs:start -->
6971

@@ -74,16 +76,16 @@
7476
```python
7577
class Solution:
7678
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]:
7980
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
8486
else:
85-
r = m
86-
return nums[l]
87+
right = mid
88+
return nums[left]
8789
```
8890

8991
### **Java**
@@ -93,15 +95,20 @@ class Solution:
9395
```java
9496
class Solution {
9597
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+
}
103110
}
104-
return nums[l];
111+
return nums[left];
105112
}
106113
}
107114
```
@@ -112,14 +119,16 @@ class Solution {
112119
class Solution {
113120
public:
114121
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;
121130
}
122-
return nums[l];
131+
return nums[left];
123132
}
124133
};
125134
```
@@ -128,19 +137,20 @@ public:
128137
129138
```go
130139
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]
144154
}
145155
```
146156

@@ -184,6 +194,28 @@ impl Solution {
184194
}
185195
```
186196

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+
187219
### **...**
188220

189221
```

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

+66-35
Original file line numberDiff line numberDiff line change
@@ -62,31 +62,37 @@
6262
```python
6363
class Solution:
6464
def findMin(self, nums: List[int]) -> int:
65-
l, r = 0, len(nums) - 1
66-
if nums[l] < nums[r]:
65+
if nums[0] <= nums[-1]:
6766
return nums[0]
68-
while l < r:
69-
m = (l + r) >> 1
70-
if nums[m] > nums[r]:
71-
l = m + 1
67+
left, right = 0, len(nums) - 1
68+
while left < right:
69+
mid = (left + right) >> 1
70+
if nums[0] <= nums[mid]:
71+
left = mid + 1
7272
else:
73-
r = m
74-
return nums[l]
73+
right = mid
74+
return nums[left]
7575
```
7676

7777
### **Java**
7878

7979
```java
8080
class Solution {
8181
public int findMin(int[] nums) {
82-
int l = 0, r = nums.length - 1;
83-
if (nums[l] < nums[r]) return nums[0];
84-
while (l < r) {
85-
int m = (l + r) >>> 1;
86-
if (nums[m] > nums[r]) l = m + 1;
87-
else r = m;
82+
int n = nums.length;
83+
if (nums[0] <= nums[n - 1]) {
84+
return nums[0];
8885
}
89-
return nums[l];
86+
int left = 0, right = n - 1;
87+
while (left < right) {
88+
int mid = (left + right) >> 1;
89+
if (nums[0] <= nums[mid]) {
90+
left = mid + 1;
91+
} else {
92+
right = mid;
93+
}
94+
}
95+
return nums[left];
9096
}
9197
}
9298
```
@@ -97,14 +103,16 @@ class Solution {
97103
class Solution {
98104
public:
99105
int findMin(vector<int>& nums) {
100-
int l = 0, r = nums.size() - 1;
101-
if (nums[l] < nums[r]) return nums[0];
102-
while (l < r) {
103-
int m = (l + r) >> 1;
104-
if (nums[m] > nums[r]) l = m + 1;
105-
else r = m;
106+
int n = nums.size();
107+
if (nums[0] <= nums[n - 1]) return nums[0];
108+
int left = 0, right = n - 1;
109+
while (left < right)
110+
{
111+
int mid = (left + right) >> 1;
112+
if (nums[0] <= nums[mid]) left = mid + 1;
113+
else right = mid;
106114
}
107-
return nums[l];
115+
return nums[left];
108116
}
109117
};
110118
```
@@ -113,19 +121,20 @@ public:
113121
114122
```go
115123
func findMin(nums []int) int {
116-
l, r := 0, len(nums) - 1
117-
if nums[l] < nums[r] {
118-
return nums[0]
119-
}
120-
for l < r {
121-
m := (l + r) >> 1
122-
if nums[m] > nums[r] {
123-
l = m + 1
124-
} else {
125-
r = m
126-
}
127-
}
128-
return nums[l]
124+
n := len(nums)
125+
if nums[0] <= nums[n-1] {
126+
return nums[0]
127+
}
128+
left, right := 0, n-1
129+
for left < right {
130+
mid := (left + right) >> 1
131+
if nums[0] <= nums[mid] {
132+
left = mid + 1
133+
} else {
134+
right = mid
135+
}
136+
}
137+
return nums[left]
129138
}
130139
```
131140

@@ -169,6 +178,28 @@ impl Solution {
169178
}
170179
```
171180

181+
### **TypeScript**
182+
183+
```ts
184+
function findMin(nums: number[]): number {
185+
const n = nums.length;
186+
if (nums[0] <= nums[n - 1]) {
187+
return nums[0];
188+
}
189+
let left = 0,
190+
right = n - 1;
191+
while (left < right) {
192+
const mid = (left + right) >> 1;
193+
if (nums[0] <= nums[mid]) {
194+
left = mid + 1;
195+
} else {
196+
right = mid;
197+
}
198+
}
199+
return nums[left];
200+
}
201+
```
202+
172203
### **...**
173204

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

0 commit comments

Comments
 (0)