面试题11:旋转数组中的最小数字
第一个指针总是指向前面递增数组中的元素,第二个指针总是指向后面递增数组中的元素。最终,第二个指针刚好指向的是最小的元素。
用二分法,时间复杂度:O(logn)。
考虑到足够多的测试用例:
{5,6,7,8,9,1,2,3,4} {2} {3,2} {1,2,3,4} {1,1,0,1,1,1,1,1,1,1}
/** * @Name:Allen * @Description: */ public class MinNumInRevertArr11 { public static void main(String[] args){ int[] arr={1,0,1,1,1,1}; Solution11 solution = new Solution11(); System.out.print(solution.solve(arr)); } } class Solution11{ int solve(int[] arr){ if(arr==null || arr.length==0){ throw new RuntimeException("array is empty"); } int begin=0,end=arr.length-1; int result=arr[begin];//如果一开始就是递增的数组,旋转的元素个数为0 int mid=(begin+end)/2; while(arr[begin]>=arr[end]){//旋转的元素个数非0 if(end-begin<=1){//end-begin=1或者0(数组有可能只有一个元素,此时end-begin=0) result = arr[end]; return result; }else{ //如果出现前后指针指向的数值和mid指向的数值是相等的,采取遍历的方法 if(arr[begin]==arr[end] && arr[end]==arr[mid]){ return result=findMin(arr,begin,end); } mid=(end+begin)/2; if(arr[mid]>=arr[begin]){ begin=mid; }else if(arr[mid]<=arr[end]){ end=mid; } } } return result; } int findMin(int[] arr,int begin,int end){ int min=arr[begin]; for(int i=begin+1; i<=end; i++){ if(arr[i]<min){ min=arr[i]; } } return min; } }