leetcode154

/*这个题目如果要求不重复元素二分就非常简单
含有重复元素就需要处理一些特殊的数据类型
例如[1,1,1,1] [1, 3,5]这些特判很简单
[10,10,10,10,10,1,10]
[10,1,10,10,10,10,10]
这种nums[mid] = nums[right]的情况挖坑数据就比较多
需要更进一步的分类
nums[mid] nums[mid-1] nums[mid+1]的区分情况
最差情况是nums[mid] = nums[right] = nums[mid-1] = nums[mid] + 1
这种处理情况选择粗暴线性扫[left,right]维护一个最小值*/
class Solution {
public:
    int minArray(vector<int>& numbers) {
         
        int len = numbers.size();
        

        int left , right , mid;
        left = 0;right = len - 1;
        if(len == 2) return min(numbers[left] , numbers[right]);

        while(left < right){
            if(numbers[left] < numbers[right]) return numbers[left];
            mid = (left + right)/2;
            if(numbers[mid] > numbers[right])       left = mid + 1;
            else if(numbers[mid] < numbers[right])  right = mid;
            else{
                 int Min = numbers[left];
                 if(numbers[mid] == numbers[mid + 1] && numbers[mid] == numbers[mid - 1]) {
                        for(int i = left;i <= right;i++)
                          Min = min(numbers[i] , Min);
                  return Min;
                 }
            else if(numbers[mid] == numbers[mid - 1] && numbers[mid] != numbers[mid + 1]) left = mid + 1;
            else if(numbers[mid] == numbers[mid + 1] && numbers[mid] != numbers[mid - 1]) right = mid;
            }
            
        }
        return numbers[left];
    }
};

 

posted on 2020-10-12 15:12  在苏州的城边  阅读(108)  评论(0编辑  收藏  举报

导航