Skip to content

Commit 8308375

Browse files
committed
feat: add python and java solution to lcof problem
添加《剑指Offer》题解:面试题11. 旋转数组的最小数字
1 parent 62ad3da commit 8308375

File tree

4 files changed

+129
-1
lines changed

4 files changed

+129
-1
lines changed

lcof/README.md

+5-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,11 @@
3434
│   ├── README.md
3535
│   ├── Solution.java
3636
│   └── Solution.py
37-
└── 面试题10- II. 青蛙跳台阶问题
37+
├── 面试题10- II. 青蛙跳台阶问题
38+
│   ├── README.md
39+
│   ├── Solution.java
40+
│   └── Solution.py
41+
└── 面试题11. 旋转数组的最小数字
3842
├── README.md
3943
├── Solution.java
4044
└── Solution.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
# [面试题11. 旋转数组的最小数字](https://leetcode-cn.com/problems/xuan-zhuan-shu-zu-de-zui-xiao-shu-zi-lcof/)
2+
3+
## 题目描述
4+
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 `[3,4,5,1,2]``[1,2,3,4,5]` 的一个旋转,该数组的最小值为 1。  
5+
6+
**示例 1:**
7+
8+
```
9+
输入:[3,4,5,1,2]
10+
输出:1
11+
```
12+
13+
**示例 2:**
14+
15+
```
16+
输入:[2,2,2,0,1]
17+
输出:0
18+
```
19+
20+
## 解法
21+
### Python3
22+
```python
23+
class Solution:
24+
def minArray(self, numbers: List[int]) -> int:
25+
if len(numbers) == 1 or numbers[0] < numbers[-1]:
26+
return numbers[0]
27+
left, right = 0, len(numbers) - 1
28+
while (right - left > 1):
29+
mid = left + ((right - left) >> 1)
30+
if numbers[mid] == numbers[left] == numbers[right]:
31+
return min(numbers[left: right + 1])
32+
if numbers[mid] >= numbers[left]:
33+
left = mid
34+
elif numbers[mid] <= numbers[right]:
35+
right = mid
36+
return numbers[right]
37+
```
38+
39+
### Java
40+
```java
41+
class Solution {
42+
public int minArray(int[] numbers) {
43+
int len = numbers.length;
44+
if (len == 1 || numbers[0] < numbers[len - 1]) {
45+
return numbers[0];
46+
}
47+
48+
int left = 0, right = len - 1;
49+
while (right - left > 1) {
50+
int mid = left + ((right - left) >> 1);
51+
if (numbers[left] == numbers[mid] && numbers[mid] == numbers[right]) {
52+
return findMin(numbers, left, right);
53+
}
54+
if (numbers[mid] >= numbers[left]) {
55+
left = mid;
56+
} else if (numbers[mid] <= numbers[right]) {
57+
right = mid;
58+
}
59+
}
60+
return numbers[right];
61+
}
62+
63+
private int findMin(int[] numbers, int left, int right) {
64+
int min = numbers[left];
65+
for (int i = left + 1; i < right; ++i) {
66+
if (min > numbers[i]) {
67+
min = numbers[i];
68+
}
69+
}
70+
return min;
71+
}
72+
}
73+
```
74+
75+
### ...
76+
```
77+
78+
```
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
class Solution {
2+
public int minArray(int[] numbers) {
3+
int len = numbers.length;
4+
if (len == 1 || numbers[0] < numbers[len - 1]) {
5+
return numbers[0];
6+
}
7+
8+
int left = 0, right = len - 1;
9+
while (right - left > 1) {
10+
int mid = left + ((right - left) >> 1);
11+
if (numbers[left] == numbers[mid] && numbers[mid] == numbers[right]) {
12+
return findMin(numbers, left, right);
13+
}
14+
if (numbers[mid] >= numbers[left]) {
15+
left = mid;
16+
} else if (numbers[mid] <= numbers[right]) {
17+
right = mid;
18+
}
19+
}
20+
return numbers[right];
21+
}
22+
23+
private int findMin(int[] numbers, int left, int right) {
24+
int min = numbers[left];
25+
for (int i = left + 1; i < right; ++i) {
26+
if (min > numbers[i]) {
27+
min = numbers[i];
28+
}
29+
}
30+
return min;
31+
}
32+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
class Solution:
2+
def minArray(self, numbers: List[int]) -> int:
3+
if len(numbers) == 1 or numbers[0] < numbers[-1]:
4+
return numbers[0]
5+
left, right = 0, len(numbers) - 1
6+
while (right - left > 1):
7+
mid = left + ((right - left) >> 1)
8+
if numbers[mid] == numbers[left] == numbers[right]:
9+
return min(numbers[left: right + 1])
10+
if numbers[mid] >= numbers[left]:
11+
left = mid
12+
elif numbers[mid] <= numbers[right]:
13+
right = mid
14+
return numbers[right]

0 commit comments

Comments
 (0)