码迷,mamicode.com
首页 > 其他好文 > 详细

154. Find Minimum in Rotated Sorted Array II

时间:2016-06-02 13:28:28      阅读:99      评论:0      收藏:0      [点我收藏+]

标签:

    /*
     * 154. Find Minimum in Rotated Sorted Array II
     * 2016-6-1 by Mingyang
     * 原来我们是依靠中间和边缘元素的大小关系,
     * 来判断哪一半是不受rotate影响,仍然有序的。
     * 而现在因为重复的出现,如果我们遇到中间和边缘相等的情况,
     * 我们就无法判断哪边有序,因为哪边都有可能有序。假设原数组是{1,2,3,3,3,3,3},
     * 那么旋转之后有可能是{3,3,3,3,3,1,2},或者{3,1,2,3,3,3,3},
     * 这样的我们判断左边缘和中心的时候都是3,我们并不知道应该截掉哪一半。
     * 解决的办法只能是对边缘移动一步,直到边缘和中间不在相等或者相遇,这就导致了会有不能切去一半的可能。
     * 所以最坏情况就会出现每次移动一步,总共移动n此,算法的时间复杂度变成O(n)。
     */
     /*
      * 如果发现 A.mid > A.left,表示左边是有序,选择左边。
      * 如果发现 A.mid < A.left, 表示无序的状态在左边,丢掉右边
      * 如果A.mid = A.left,说明无法判断。这时我们可以把left++,丢弃一个即可。不必担心丢掉我们的目标值。因为A.left == A.mid,即使选择了left,还有mid在嘛!
      * 每次进入循环,我们都要判断A.left < A.right,原因是,前面我们丢弃一些数字时,有可能造成余下的数组是有序的,这时应直接返回A.left!
      */

     //这里笔者仅仅在I的基础上改动了两笔就通过了,所以这个是非常棒的
     public int findMin1(int[] nums) {
            int len=nums.length;
                if(len==0||nums==null)
                  return 0;
                int low=0;
                int high=len-1;
                while(low<=high){
                    if(nums[low]<nums[high])
                      return nums[low];
                    int mid=(low+high)/2;
                    if(mid==low||high==low){
                        return nums[low]<nums[high]?nums[low]:nums[high];
                    }else if(nums[mid]<nums[mid-1]&&nums[mid]<nums[mid+1]){
                        return nums[mid];
                    }else if(nums[low]<nums[mid]&&nums[high]<nums[mid]){
                        low=mid+1;
                    }else if(nums[low]<nums[mid]&&nums[mid]<nums[high]){
                        high=mid-1;
                    }else if(nums[low]==nums[mid]){
                        low++;//这里就是多的情况1,如果low==mid,千万不要 low=mid+1;不然过不了311
                    }else{
                        high--;//这里就是多的情况2
                    }
                }
                return nums[low];
            }

 

154. Find Minimum in Rotated Sorted Array II

标签:

原文地址:http://www.cnblogs.com/zmyvszk/p/5552583.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!