新手算法学习之路----二分法Find Minimum in Rotated Sorted Array

题目:假设一个旋转排序的数组其起始位置是未知的(比如0 1 2 4 5 6 7 可能变成是4 5 6 7 0 1 2)。

           你需要找到其中最小的元素。

          你可以假设数组中不存在重复的元素。

思路:首先排除三种极端情况,空,只有一个元素,以及整个数组都是顺序排列的。

           当顺序的数组随机旋转排列后,就分为两个顺序列入题目中的4567和012,寻找到中间数来和数组最后一个元素对比,如果大于的话说明最小的数在中间数的右边,如果小于的话说明最小数在中间数的左边,然             后继续按照二分法来找。注:不会出现中间数等于最后一个元素,因为题目中说明了没有重复元素。

问题:我当时的思路是这两个数组能不能被分成两部分,两个升序数组来求最小数,最后证明不对;由于思维被禁锢在二分法使用的前提是一个排好序的数组,结果更本没有想到使用下边的办法,这个是我借鉴别人的偶,自己又简化了一下。

public int findMin(int[] nums) {
        // write your code here
         if( nums == null)  //先排三种特殊的情况
            return 0;
        if(nums.length == 1)
            return nums[0];
        int low = 0;
        int high = nums.length -1;
        int mid = low;
        while(low < high-1){
            mid = (low + high)/2;
            if(nums[mid] >  nums[high]){       //如果中间大于最后一个元素那说明最小的数在中间数的右边
                low = mid;              //数组的前一半排除掉
            }else if( nums[mid] < nums[high]){  //如果中间数小于最后一个元素,说明中间数后面部分的升序部分里面,那最小说就在中间数左边了
                high = mid ;
            }
        }
        if(nums[low]<nums[high]) return nums[low];
        else if(nums[low]>nums[high]) return nums[high];
        else return -1;
    }

 

posted @ 2017-07-06 22:17  JunLiu37  阅读(134)  评论(0编辑  收藏  举报