LeetCode: Search in Rotated Sorted Array
Suppose a sorted array is rotated at some pivot unknown to you beforehand.
(i.e., 0 1 2 4 5 6 7
might become 4 5 6 7 0 1 2
).
You are given a target value to search. If found in the array return its index, otherwise return -1.
You may assume no duplicate exists in the array.
地址:https://oj.leetcode.com/problems/search-in-rotated-sorted-array/
算法:将二分查找稍微改进一下就可以了。首先,我们把旋转后的数组分为上部分和下部分,比如题目例子中(4 5 6 7)为上部分,(0 1 2)为下部分,注意上部分和下部分都有可能为空。如果中间节点等于目标值,返回;否则,若中间节点大于尾节点,说明中间节点处于上部分,此时在分三种情况讨论,具体可以看代码;若中间节点小于等于尾节点,说明中间节点处于下部分,此时也可以分三种情况,具体看代码。代码:
1 class Solution {
2 public:
3 int search(int A[], int n, int target) {
4 if(n < 1) return -1;
5 int begin = 0, end = n-1;
6 int mid = 0;
7 while(begin <= end){
8 mid = (begin + end) >> 1;
9 if(A[mid] == target){
10 return mid;
11 }
12 if(A[mid] > A[end]){
13 if(A[mid] < target)
14 begin = mid + 1;
15 else if(target > A[end]){
16 end = mid - 1;
17 }else{
18 begin = mid + 1;
19 }
20 }else{
21 if(A[mid] > target){
22 end = mid - 1;
23 }else if(target <= A[end]){
24 begin = mid + 1;
25 }else{
26 end = mid - 1;
27 }
28 }
29 }
30 return -1;
31 }
32 };
第二题:
Follow up for "Search in Rotated Sorted Array":
What if duplicates are allowed?
Would this affect the run-time complexity? How and why?
Write a function to determine if a given target is in the array.
地址:https://oj.leetcode.com/problems/search-in-rotated-sorted-array-ii/
算法:跟上一题比,多了一个条件:数组中的元素有可能不唯一。同样把bottom和top之间分为上部分和下部分。首先,如果mid就是要找的元素,直接返回;否则,如果top的元素大于bottom的元素,说明bottom和top之间的元素是有序的,则按正常的二分查找即可。否则如果mid大于bottom,则mid位于上部分,所以分三种情况讨论;如果mid小于bottom,则mid为于下部分,所以也分三种情况讨论;剩下mid等于bottom的情况,如果此时mid大于top的话,那说明bottom和mid之间的所有元素都相等,所以都不等与target,故bottom之间设为mid+1;剩下的情况直接线性查找。代码:
1 class Solution {
2 public:
3 bool search(int A[], int n, int target) {
4 if(!A || n < 1){
5 return false;
6 }
7 int bottom = 0;
8 int top = n - 1;
9 while(bottom <= top){
10 int mid = (bottom + top) / 2;
11 if(A[mid] == target){
12 return true;
13 }
14 if(A[top] > A[bottom]){
15 if(A[mid] < target)
16 bottom = mid + 1;
17 else
18 top = mid - 1;
19 }else{
20 if(A[mid] > A[bottom]){
21 if(A[mid] < target)
22 bottom = mid + 1;
23 else if(A[bottom] <= target)
24 top = mid - 1;
25 else
26 bottom = mid + 1;
27 }else if(A[mid] < A[bottom]){
28 if(A[mid] > target)
29 top = mid - 1;
30 else if(A[top] >= target)
31 bottom = mid + 1;
32 else
33 top = mid - 1;
34 }else{
35 if(A[top] < A[mid]){
36 bottom = mid + 1;
37 }else{
38 for(int i = bottom; i <= top; ++i){
39 if(A[i] == target){
40 return true;
41 }
42 }
43 return false;
44 }
45 }
46 }
47 }
48 return false;
49 }
50 };