题目
代码分析
需要考虑的情况比较多,只要是start,end,mid之间两两相等或者是全部相等的情况。该逻辑的位置,应该在普通情况判断的后面,其次就是这种情况的种类,分为四种
33333123 33333453 34533333 31233333
代码实现
class Solution { public int findMin(int[] nums) { int start=0; int end=nums.length-1; while(start<end) { //所有的特殊情况 if(nums[start]<nums[end]) { return nums[start]; } if(start+1==end) { return Math.min(nums[start],nums[end]); } int mid=(start+end)/2; //先考虑不重复的情况 if(nums[start]<nums[mid]) { start=mid; continue; } else if(nums[start]>nums[mid]) { end=mid; continue; } //然后就是特殊情况 //可能三个都相等,也可能只是两两相等 while(start<mid&&nums[start]==nums[mid]) { start++; } if(start!=mid) { if(nums[start]>nums[mid]) return nums[mid]; else if(nums[start]<nums[mid]) return nums[start]; } } return nums[start]; } }