LeetCode:81. Search in Rotated Sorted Array II

先看一下前一题的第二种解法:
https://blog.csdn.net/weixin_43462819/article/details/100072501
在这里插入图片描述
这一题相对于同系列的第一题多出的条件是:元素可能重复。
这样导致的一个重要结果就是:不能轻易的通过比较nums[mid] >= nums[lo]来判断左边或者右边有序了,因为比如[1,1,1,2,1]和[1,2,1,1,1]这两种情况,你不能说哪边是有序的。
但是这种情况出现的时候就是:nums[mid]==nums[lo]==nums[hi] 。这时候做一个小操作:把两边都往里面移动一位。因为两边的都不是target,所以这么做是没有错的。

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

所以相对于系列前一题,就是多一个

 		if (nums[mid] == nums[lo] && nums[mid] == nums[hi]) {
            ++lo;
            --hi;
        }

这个操作就可以了。
所以前一题还是推荐记住第二种解法,这样就可以两题通用了。

这一题最坏是O(N)复杂度。

posted @ 2019-08-26 11:15  于老师的父亲王老爷子  阅读(11)  评论(0编辑  收藏  举报