首页 > 代码库 > leetcode旋转数组查找 二分查找的变形
leetcode旋转数组查找 二分查找的变形
http://blog.csdn.net/pickless/article/details/9191075
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.
设置 low=0 high=len-1
bsearch(A,low,high)=bsearch(A,low,mid-1)||bsearch(A,mid+1,high) (A[mid]!=target)
mid (A[mid]==target)
这是传统的思路:
我们经过观察发现,只要 A[high]>=A[low] 数组一定是递增的,则选用二分查找
如果不是,则分割 ,使用递归,一定能分割成数组满足第一种状态,
比如,上边的例子我们查找 5,
mid=3,A[mid]=7;分割成(4,5,6)和(0,1,2)连个尾巴都是大于首部,所以直接会被二分查找。
1 public class Solution { 2 public int search(int[] A, int target) { 3 int len=A.length; 4 if(len==0) return -1; 5 return bsearch(A,target,0,len-1); 6 7 8 9 }10 11 public int bsearch(int A[],int target,int low,int high)12 {13 if(low>high) return -1; 14 int idx=-1;15 if(A[low]<=A[high]) //it must be YouXu,so binary search16 17 {18 while(low<=high)19 {20 int mid=(low+high)>>1;21 if(A[mid]==target) 22 {23 idx=mid;24 return idx;25 }26 else if(A[mid]>target)27 {28 high=mid-1;29 }30 else low=mid+1;31 }32 33 }34 else35 {36 int mid=(low+high)>>1;37 if(A[mid]==target)38 {39 idx=mid;40 return idx;41 42 }43 else 44 {45 idx=bsearch(A,target,low,mid-1);46 if(idx==-1)47 {48 idx=bsearch(A,target,mid+1,high);49 50 }51 52 53 54 55 }56 57 58 59 60 61 62 }63 64 return idx;65 66 67 }68 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。