Search in Rotated Sorted Array II

本文介绍了一种在含有重复元素的旋转有序数组中搜索特定目标值的方法。通过调整二分查找算法,文章提供了一种有效解决方案,并详细解释了如何确定数组中的有序部分来缩小搜索范围。

Follow up for "Search in Rotated Sorted Array":
What if duplicates are allowed?

Would this affect the run-time complexity? How and why?

Write a function to determine if a given target is in the array.

参考“Search in Rotated Sorted Array

每次找到中间点mid以后,先分别向左和向右找到与A[mid]不同的点,然后再用上面的办法进行二分,即先确定有序的一边,然后再判断target的值是否在有序的那个范围里面,如果在则查找有序的那边,如果不在则查找另一半边。

class Solution {
public:
    bool search(int A[], int n, int target) {
        int start = 0;
        int end = n-1;
        int mid;
        while(start<=end){
            mid = (start+end)/2;
            if(A[mid]==target)
                return true;
            int kr = mid;
            while(kr<=end && A[kr]==A[mid])
                kr++;
            int kl = mid;
            while(kl>=start && A[kl]==A[mid])
                kl--;
            if(kr>end){
                if(kl<start)
                    return false;
                else{
                    end = kl;
                    continue;
                }
            }
            if(kl<start){
                if(kr<=end){
                    start = kr;
                    continue;
                }
            }
            kr--;
            kl++;
            if(A[kr]<=A[end]){
                if(A[mid]<target && A[end]>=target)
                    start = kr+1;
                else
                    end = kl-1;
                continue;
            }
            if(A[kl]>=A[end]){
                if(A[start]<=target && A[mid]>target)
                    end = kl-1;
                else
                    start = kr+1;
            }
            
        }
        return false;
    }
};



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值