标签:
/* * 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