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.
解题思路: 题目中数组没有重复,则比较A[mid]与A[end]来确定mid所处的位置;然后根据二分查找来修正st和en;确定唯一的情况;
代码:
- int search(int A[], int n, int target) {
- if(n<=0) return -1;
- int st = 0;
- int en = n-1;
- while(st<=en) {
- int mid = st + ((en-st)>>1);
- if(A[mid] == target) {
- return mid;
- }
- if(A[mid]>A[en]) {
- if(A[mid] > target && target>=A[st]) { // 不要忘记等号
- en = mid - 1;
- } else {
- st = mid + 1;
- }
- } else {
- if(A[mid] < target && target <= A[en]) { //不要忘记等号
- st = mid + 1;
- } else {
- en = mid - 1;
- }
- }
- }
- return -1;
- }
递归实现:
- int search(int A[], int n, int target) {
- return search(A,0,n-1,target);
- }
- int search(int A[],int start,int end,int target) {
- if(start>end) return -1;
- int mid = start + ((end - start) >> 1); // + has high priority than >>
- int num1 = A[start];
- int num2 = A[mid];
- int num3 = A[end];
- if(num2 == target) return mid;
- if(num1 <= num2) {
- if(num1 > target || target > num2) {
- return search(A,mid+1,end,target);
- } else {
- return search(A,start,mid-1,target);
- }
- }
- if(target < num2 || target > num3)
- return search(A,start,mid-1,target);
- return search(A,mid+1,end,target);
- }