标签:blog os io for ar art div log
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.
排序的数组查找可以采用二分查找的方法~,有序数组被转动后依然可以采用二分的思想,但是要考虑到start,end与mid的大小决定递归调用二分还是自身。
因为分治后的数组一半严格有序,一半有序的转动数组。
1st (7 tries)
class Solution { public: int search(int A[], int n, int target) { // Note: The Solution object is instantiated only once and is reused by each test case. if(A[0]<A[n-1]) return orderfind(A,0,n-1,target); else return find(A,0,n-1,target); } int find(int A[],int start,int end,int target) { if(start > end||end < start) { return -1; } int mid = (start + end)/2; if(target == A[mid]) { return mid; } else if(target > A[mid]) { if(A[mid] > A[start]) return find(A,mid+1,end,target); else if(A[mid] == A[start]) return find(A,mid+1,end,target); else { if(target == A[start]) return start; else if(target > A[start]) return find(A,start,mid-1,target); else return orderfind(A,mid+1,end,target); } } else { if(A[mid] < A[start]) return find(A,start,mid-1,target); else if(A[mid] == A[start]) return find(A,mid+1,end,target); else { if(target == A[start]) return start; else if(target > A[start]) return orderfind(A,start,mid-1,target); else return find(A,mid+1,end,target); } } } int orderfind(int A[],int start,int end,int target) { if(start > end||end < start) { return -1; } int mid = (start + end)/2; if(target == A[mid]) { return mid; } else if(target > A[mid]) { return orderfind(A,mid+1,end,target); } else { return orderfind(A,start,mid-1,target); } } };
2nd (2 tries)
class Solution { public: 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)/2; //rotate n if(A[start] <= A[end]) return bsearch(A,start,end,target); if(A[mid] == target) return mid; else if(A[mid] > target) { if(A[mid] >= A[start]) { if(A[start] > target) return search(A,mid+1,end,target); else return bsearch(A,start,mid-1,target); } else { return search(A,start,mid-1,target); } } else { if(A[mid] >= A[start]) { return search(A,mid+1,end,target); } else { if(target > A[end]) { return search(A,start,mid-1,target); } else { return bsearch(A,mid+1,end,target); } } } } int bsearch(int A[], int start, int end,int target) { while(start <= end) { int mid = start + (end - start)/2; if(A[mid] == target) return mid; else if(A[mid] > target) end = mid-1; else start = mid+1; } return -1; } };
【Leetcode】Search in Rotated Sorted Array,布布扣,bubuko.com
【Leetcode】Search in Rotated Sorted Array
标签:blog os io for ar art div log
原文地址:http://www.cnblogs.com/weixliu/p/3924324.html