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)复杂度。