LeetCode 刷题记录 81. Search in Rotated Sorted Array II

题目:
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?
解法:
LeetCode 刷题记录 33.Search in Rotated Sorted Array
的升级版
应用其中的解法1
解法1的核心思想是中间值小于最右的值,则右半段有序,如果大于最右的值,则左半段有序,然后再进行二分查找
但是该解法建立在没有重复的元素,该题中有重复元素,所以会出现中间值与最右的值相等的时候
就会出现来面两种情况,[3 1 1] 和 [1 1 3 1],对于这两种情况中间值等于最右值时,目标值3既可以在左边又可以在右边,那怎么办么,对于这种情况其实处理非常简单,只要把最右值向左一位即可继续循环,也可以最左值向右一位即可继续循环
c++:

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

    }
};

java

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

python:

class Solution(object):
    def search(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: bool
        """
        lo = 0
        hi = len(nums) - 1
        while lo <= hi:
            mid = lo + (hi - lo) / 2
            
            if nums[mid] == target: return True
            if nums[mid] < nums[hi]:
                
                if target > nums[mid] and target <= nums[hi]: lo = mid + 1
                else: hi = mid -1
                
            elif nums[mid] > nums[hi]:
                if target >= nums[lo] and target < nums[mid]: hi = mid - 1
                else: lo = mid + 1
            else:
                hi -= 1
            
        
        return False
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值