import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型一维数组 * @return int整型 */ public int minNumberInRotateArray (int[] nums) { // write code here //当最后一个元素是最小值时 if(nums[nums.length-2]>nums[nums.length-1]) return nums[nums.length-1]; int left = 0; int right = nums.length-2; int mid = (left+right)/2; while(left<=right){ while(nums[mid]==nums[left]) left++; while(nums[mid]==nums[right]) right--; mid = (left+right)/2; if(mid==0) { if(nums[mid]<nums[mid+1]) return nums[mid]; } if(nums[mid]>nums[mid+1]) return nums[mid+1]; if(nums[mid]<nums[mid-1]) return nums[mid]; else if(nums[mid] >= nums[mid-1] && nums[mid] <= nums[mid+1]) { if(nums[mid]>nums[0]) left = mid+1; if(nums[mid]<nums[0]) right = mid-1; } } return nums[mid]; } }
处理边缘元素为最小值的情况,
处理元素相等的情况,移动left或者right即可。(nums[mid]==nums[left]说明left可以排除在求解的区间外,因为如果left是最小值,那么mid也是最小值。)
当left<mid<right时,如何划分区间呢?这里利用了旋转的性质,因为旋转,所以数组是两部分非降序数组拼接而成,且后一部分的数组小于nums[0],所以可以得到:
如果mid>nums[0],mid在前一部分数组;
否则mid在后一部分数组。(mid和nums[0]相等的情况在前面已经处理了)