Skip to content

Commit 0413b63

Browse files
committed
33 Search in Rotated Sorted Array
1 parent ef153ef commit 0413b63

File tree

6 files changed

+99
-1
lines changed

6 files changed

+99
-1
lines changed

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
+ [27 Remove Element](algorithms/RemoveElement)
2525
+ [29 Divide Two Integers(位运算、最小负数绝对值、溢出检测)](algorithms/DivideTwoIntegers)
2626
+ [31 Next Permutation(全排列)](algorithms/NextPermutation)
27+
+ [33 Search in Rotated Sorted Array(二分搜索)](algorithms/SearchinRotatedSortedArray)
2728
+ [34 Search for a Range(二分)](algorithms/SearchforaRange)
2829
+ [35 Search Insert Position(二分查找)](algorithms/SearchInsertPosition)
2930
+ [38 Count and Say(字符串和数字转化详解)](algorithms/CountandSay)

algorithms/FindMinimuminRotatedSortedArray/README.md

+3-1
Original file line numberDiff line numberDiff line change
@@ -40,4 +40,6 @@ int findMin(vector<int> &nums) {
4040
4141
## 扩展
4242
43-
当有重复元素存在时,见[Find Minimum in Rotated Sorted Array II](../FindMinimuminRotatedSortedArray2)
43+
1. 当有重复元素存在时,见[Find Minimum in Rotated Sorted Array II](../FindMinimuminRotatedSortedArray2)
44+
45+
2. [Search in Rotated Sorted Array](../SearchinRotatedSortedArray), 在旋转列表中查找某个数

algorithms/FindMinimuminRotatedSortedArray2/README.md

+6
Original file line numberDiff line numberDiff line change
@@ -41,3 +41,9 @@ int findMin(vector<int> &nums) {
4141
return nums[s];
4242
}
4343
```
44+
45+
## 扩展
46+
47+
[Search in Rotated Sorted Array](../SearchinRotatedSortedArray), 从旋转列表中查找某个值
48+
49+
[Find Minimum in Rotated Sorted Array](../FindMinimuminRotatedSortedArray)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
## Search in Rotated Sorted Array
2+
3+
Suppose a sorted array is rotated at some pivot unknown to you beforehand.
4+
5+
(i.e., `0 1 2 4 5 6 7` might become `4 5 6 7 0 1 2`).
6+
7+
You are given a target value to search. If found in the array return its index, otherwise return -1.
8+
9+
You may assume no duplicate exists in the array.
10+
11+
## Solution
12+
13+
既然是有序,自然想到二分搜索, 和[Find Minimum in Rotated Sorted Array](../FindMinimuminRotatedSortedArray)类似:
14+
15+
初始化s = 0, t = n - 1:
16+
17+
* 若a[s] < a[t], 比如`1 2 3 4 5`,则整个列表有序,直接二分搜索即可.
18+
* `mid = s + ((t - s) >> 1)`, 若`a[mid] == key`, 返回mid,结束
19+
* `a[mid] < a[t]`, 比如`5 1 [2] 3 4``4 5 [1] 2 3`, 则右边一定是有序的:
20+
21+
+ 若`a[mid] < key <= a[t]`, 二分搜索右边部分即可
22+
+ 否则搜索左边, `t = mid - 1`
23+
24+
* `a[mid] > a[t]`, 比如`3 4 [5] 1 2` 或者 `2 3 [4] 5 1`, 则左边一定是有序的:
25+
26+
+ 若`a[s] <= key < a[mid]`, 二分搜索左边部分
27+
+ 否则搜索右边,`s = mid + 1`
28+
29+
## 扩展
30+
31+
1. [Find Minimum in Rotated Sorted Array](../FindMinimuminRotatedSortedArray)
32+
33+
2. [Find Minimum in Rotated Sorted Array II](../FindMinimuminRotatedSortedArray2)
34+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
5 2
2+
1 2 3 4 5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
#include <stdlib.h>
2+
#include <stdio.h>
3+
#include <string.h>
4+
int binarySearch(int *a, int s, int t, int key)
5+
{
6+
while (s <= t) {
7+
int mid = s + ((t - s) >> 1);
8+
if (a[mid] == key)
9+
return mid;
10+
if (a[mid] > key)
11+
t = mid - 1;
12+
else
13+
s = mid + 1;
14+
}
15+
return -1;
16+
}
17+
int search(int *a, int n, int key)
18+
{
19+
int s = 0, t = n - 1;
20+
while (s <= t) {
21+
if (a[s] < a[t])
22+
return binarySearch(a, s, t, key);
23+
int mid = s + ((t - s) >> 1);
24+
//printf("s = %d, t = %d, mid = %d\n", s, t, mid);
25+
if (a[mid] == key)
26+
return mid;
27+
if (a[mid] < a[t]) {
28+
if (a[mid] < key && key <= a[t])
29+
return binarySearch(a, mid + 1, t, key);
30+
else
31+
t = mid - 1;
32+
} else { // a[mid] > a[t]
33+
if (a[s] <= key && key < a[mid]) // 若key 在s和mid之间
34+
return binarySearch(a, s, mid - 1, key);
35+
else
36+
s = mid + 1;
37+
}
38+
}
39+
return -1;
40+
}
41+
void print(int *a, int n)
42+
{
43+
for (int i = 0; i < n; ++i)
44+
printf("%d ", a[i]);
45+
printf("\n");
46+
}
47+
int main(int argc, char **argv)
48+
{
49+
int a[] = {4,5,6,7,8,1,2,3};
50+
print(a, 8);
51+
printf("%d:%d\n", 8, search(a, 8, 8));
52+
return 0;
53+
}

0 commit comments

Comments
 (0)