有序数切断重组
将一个升序数组在中间截断成两部分,重新组合成数组,要在数组中找target 返回index,不在数组中返回-1
主要思想还是二分
只是分类讨论的情况比二分的多。
/** * leetcode rotated Array * 将一个有序(不妨假设是升序吧)的数组切割后重组,找出目标元素。 变相的二分查找 * 有两种 1.数组无重复元素 2. 数组有重复的元素 * 若target不在数组中,则返回-1 时间复杂度lg2n * @author admin */ public static int search(int [] A,int target){ int len =A.length; if(len==0) return -1; else if(len==1) return A[0]==target?0:-1; int left =0,right=len-1; while(left<right){ int mid = left+(right-left)/2; if(target==A[mid]) return mid; else if(target ==A[left]) return left; else if(target==A[right]) return right; //没有切割的情况 if(A[left]<A[right]&&(target<A[left]||target>A[right])) return -1; if(A[left]<A[mid]&&A[mid]>target&&A[left]<mid) { right = mid-1; continue; } if(A[left]>A[right]&&A[mid]<target&&A[right]>target) { left = mid+1; continue; } if(A[left]<A[mid]&&A[mid]<target){ left = mid+1; continue; } if(A[left]>A[mid]){ right = mid-1; continue; } } return -1; }