LeetCode Day65

在不含重复元素的基础上,可能出现中间元素与右边元素相同的情况.
因为判断了与中间元素不相等,所以当中间元素与最右元素相等时(此时左半部分也不一定是全部相同的,如[3 1 1]),最右元素可以直接跳过不用判断,right–.重新计算mid与最右判断,若有,则可以判断这一段(存在比中间元素大[1 1 1 2 3 1])或者是左半段(存在比中间元素小,如[3 3 3 1 2 3])是排序的,按照原二分查找执行.若无,直接找到不存在(说明整个数组都是相同的,跳出条件left>right)

class Solution {
public:
    bool search(vector<int>& nums, int target) {
        int left=0,right=nums.size()-1,mid=0;
        while(left<=right){
            mid=(left+right)/2;
            if(nums[mid]==target) return true;
            else if(nums[mid]<nums[right]){
                if(target>nums[mid]&&target<=nums[right]) left=mid+1;
                else right=mid-1;
            }
            else if(nums[mid]>nums[right]){
                if(target<nums[mid]&&target>=nums[left]) right=mid-1;
                else left=mid+1;
            }
            else right--;
        }
        return false;
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_41394379/article/details/85852510
今日推荐