leetcode81 - Search in Rotated Sorted Array II - medium

Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.

(i.e., [0,0,1,2,2,5,6] might become [2,5,6,0,0,1,2]).

You are given a target value to search. If found in the array return true, otherwise return false.

Example 1:

Input: nums = [2,5,6,0,0,1,2], target = 0
Output: true

Example 2:

Input: nums = [2,5,6,0,0,1,2], target = 3
Output: false

Follow up:

  • This is a follow up problem to Search in Rotated Sorted Array, where nums may contain duplicates.
  • Would this affect the run-time complexity? How and why?
 
引入duplicates之后有啥改变?nums[l]可能等于nums[r]了, 也就是之前target在右下的情况里,nums[m] > nums[r]这一种不成立了。或者说如果nums[l] == nums[m] == nums[r], l=m之后,我们也没法locate target到底在左上还是在右下。
两种方法:
1. loop之前,while (nums[r] == nums[0]), 把r左移,手动让nums[m] > nums[r]成立
2. loop里面,每当nums[m] == nums[l], 把l右移一格,然后直接去下一个循环,也就是cross out这个l,锁定l+1到m这个区间,但不做具体操作因为确定不了得做哪种操作
 
实现1:注意移r的时候得保证r>0,比如nums只有一个数的时候,nums[0]==nums[r],但这时候就不能动了
class Solution {
public:
    bool search(vector<int>& nums, int target) {
        
        if(nums.empty())
            return false;
        
        int l = 0, r = nums.size()-1;
        while (nums[r] == nums[0] && r > 0) 
            r--;
        while (l < r){
            int m = l + (long long)r + 1 >> 1;
            if (nums[m] == target)
                return true;
            if (target <= nums[r]){
                if (nums[m] <= target || nums[m] > nums[r])
                    l = m;
                else
                    r = m - 1;
            }else{
                if (nums[l] <= nums[m] && nums[m] <= target)
                    l = m;
                else
                    r = m - 1;
            }
        }
        
        return nums[l] == target;
        
    }
};

 

实现2:

class Solution {
public:
    bool search(vector<int>& nums, int target) {
        
        if(nums.empty())
            return false;
        
        int l = 0, r = nums.size()-1;

        while (l < r){
            int m = l + (long long)r + 1 >> 1;
            if (nums[m] == target)
                return true;
            
            if (nums[l] == nums[m]){
                l++;
                continue;
            }
            
            if (target <= nums[r]){
                if (nums[m] <= target || nums[m] > nums[r])
                    l = m;
                else
                    r = m - 1;
            }else{
                if (nums[l] < nums[m] && nums[m] <= target)
                    l = m;
                else
                    r = m - 1;
            }
        }
        
        return nums[l] == target;
        
    }
};

 

你可能感兴趣的:(leetcode81 - Search in Rotated Sorted Array II - medium)