搜索旋转排序数组

假设有一个排序的按未知的旋转轴旋转的数组(比如,0 1 2 4 5 6 7 可能成为4 5 6 7 0 1 2)。给定一个目标值进行搜索,如果在数组中找到目标值返回数组中的索引位置,否则返回-1。

你可以假设数组中不存在重复的元素。

样例

给出[4, 5, 1, 2, 3]和target=1,返回 2

给出[4, 5, 1, 2, 3]和target=0,返回 -1

一道二分查找的题目
public:
    int search(vector<int> &a, int target) {
        if(a.size()==0)return -1;
        // write your code here
    
        int s=0;
        int e=a.size()-1;
        while(s<=e)
        {
            int m=(s+e)/2;
            if(a[m]==target)return m;
            if(a[s]<=a[e])
            {
                if(a[m]>target)e=m-1;
                else s=m+1;
            }
            else if(a[m]>=a[s])
            {
                if(a[m]>target&&a[s]<=target)e=m-1;
                else s=m+1;
            }
            else if(a[m]<a[s])
            {
                if(a[m]<target&&a[e]>=target)s=m+1;
                else e=m-1;
            }
            
        }
        return -1;
    }


题目改进:

跟进“搜索旋转排序数组”,假如有重复元素又将如何?

是否会影响运行时间复杂度?

如何影响?

为何会影响?

写出一个函数判断给定的目标值是否出现在数组中。

样例

给出[3,4,4,5,7,0,1,2]和target=4,返回 true

多考虑几种情况

例如 95678999999 查找8

        22231查找1

    bool search(vector<int> &a, int target) {
        // write your code here
                if(a.size()==0)return false;
        // write your code here
    
        int s=0;
        int e=a.size()-1;
        while(s<=e)
        {
            while(s+1<=e&&a[s]==a[s+1])s=s+1;
            int m=(s+e)/2;
            if(a[m]==target)return true;
            if(a[s]<a[e])
            {
                if(a[m]>target)e=m-1;
                else s=m+1;
            }
            else if(a[m]>a[s])
            {
                if(a[m]>target&&a[s]<=target)e=m-1;
                else s=m+1;
            }
            else if(a[m]<=a[s])
            {
                if(a[m]<target&&a[e]>=target)s=m+1;
                else e=m-1;
            }
           
            
        }
        return false;;
    }



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值