81. Search in Rotated Sorted Array II

https://leetcode.com/problems/search-in-rotated-sorted-array-ii/

对于一个有序数组,将其元素以某一个元素为轴进行旋转,比如[0,1,2,3,4,5,6,7]可能会变成[4,5,6,7,0,1,2,3]
求这个经过旋转的数组中是否存在有值等于target,如果有的话就返回其true,如果没有就返回false;数组中存在重复值

这里与search-in-rotated-sorted-array类似,也是先找到分界点,然后确定target在左边还是在右边;
注意点:

  • 找最小值分界点时,由于存在重复值,需要在while循环加入 nums[lo]>=nums[hi] 判断,此时跳出循环后 hi 和 lo不一定相等
  • 找到最小值分界点后,判断target在左边还是右边
  • 去掉多余的重复值
  • 再用一个二分查找去判断 target 是否存在
class Solution {
public:
    bool search(vector<int>& nums, int target) {
        int lo = 0, hi = nums.size()-1;
        if(hi==-1)
            return false;
        while(lo < hi && nums[lo] >= nums[hi])
        {
            int mi = (lo + hi)>>1;
            if (nums[mi]<nums[hi])
                hi = mi;
            else if(nums[mi] > nums[hi])
                lo = mi + 1;
            else
                lo = lo + 1;
        }

        if(target <= nums[nums.size()-1])
        {
            lo = lo; hi = nums.size()-1;
        }
        else
        {
            hi = lo-1;
            lo = 0;
        }
        
        while(hi>=1 && nums[hi]==nums[hi-1])
            if(nums[hi]==target)
                return true;
            else
                hi-=2; //同时去掉两个相同的数值
        while(lo < hi)
        {
            int mi = (lo + hi)>>1;
            if (nums[mi] < target)
                lo = mi + 1;
            else
                hi = mi;
        }
        return nums[lo]==target;
    }
};

结果:

Runtime: 4 ms, faster than 98.90% of C++ online submissions for Search in Rotated Sorted Array II.
Memory Usage: 7.9 MB, less than 100.00% of C++ online submissions for Search in Rotated Sorted Array II.

原文地址:https://www.cnblogs.com/qiulinzhang/p/12530127.html