Search in rotated sorted Array

45 篇文章 0 订阅
38 篇文章 0 订阅

算法框架和普通折半查找一样,主要变量就是begin, end, mid。考虑的区间也一样,都是[begin,mid), [mid], (mid,end]这三种情况,只是判断条件的部分不同。

1)若target==A[mid] 返回mid.

2)之后只有两种情况:target 要么落在[begin,mid) 要么落在(mid,end],只是判断条件和普通折半查找有所不同。这两个区间一个是纯单调区间,一个是混合区间。一个数x是否落在一个纯区间(a,b)的判断条件很简单,就是 a<x<b,所以优先判断这种情况,另一种情况放在else里。纯区间是哪个要分mid落在前半部分(A[begin]<A[mid])还是后半部分:

  mid在前半部分:纯区间是[being,mid),target落在这个区间的条件是 A[begin]<=target<A[mid] ,否则落在(mid,end].

  mid在后半部分:纯区间是(mid,end],target落在这个区间的条件是 A[mid]<target<=A[end], 否则落在[begin,mid).


如何判断mid落在哪个部分?如果A[mid]>A[begin],可以确定mid落在前半部分,如果A[mid]<A[begin] 可以确定mid落在后半部分。当A[mid]==A[begin]无法确定,这时候只需要begin++,排除当前begin往下看,因为A[mid]也等于这个值,这个值不会丢,所以不影响结果。

bool search(int A[], int n, int target) {
        int i=0,j=n-1;
        while(i<=j)
        {
            int mid= (i+j)/2;
            if(A[mid]==target)
                return true;
            if(A[i]==A[mid]) //if A[i] == A[mid], skip A[i], since the value still in the remaining interval
                i++;
            else if(A[i]<A[mid])
            {
                if(target<A[mid] && target>=A[i])
                    j=mid-1;
                else
                    i=mid+1;
            }
            else
            {
                if(target>A[mid] && target<=A[j])
                    i=mid+1;
                else
                    j=mid-1;
            }
        }
        return false;
    }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值