Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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‎

Lines changed: 1 addition & 1 deletion
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‎

Lines changed: 70 additions & 38 deletions
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‎

Lines changed: 66 additions & 35 deletions
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
```
Lines changed: 14 additions & 12 deletions
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
};
Lines changed: 15 additions & 14 deletions
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
}
Lines changed: 17 additions & 11 deletions
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)

AltStyle によって変換されたページ (->オリジナル) /