题目

代码分析

需要考虑的情况比较多,只要是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];
    }
}

学习情况