首页 > 试题广场 >

在转动过的有序数组中寻找目标值

[编程题]在转动过的有序数组中寻找目标值
  • 热度指数:34766 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
给出一个转动过的有序数组,你事先不知道该数组转动了多少
(例如,0 1 2 4 5 6 7可能变为4 5 6 7 0 1 2).
在数组中搜索给出的目标值,如果能在数组中找到,返回它的索引,否则返回-1。
假设数组中不存在重复项。
示例1

输入

[1],0

输出

-1
示例2

输入

[3,2,1],1

输出

2
推荐
暴力求解
class Solution {
public:
    int search(int A[], int n, int target) {
        for(int i=0;i<n;i++)
            if(A[i]==target)
                return i;
         return -1;
    }
};

二分查找法,重点在于左右边界的确定
整个旋转数组分为两部分一定有一部分有序,那么通过判断左边还是右边有序分为两种情况。
然后再判断向左走还是向右走
class Solution {
public:
    int search(int A[], int n, int target) {
        int first=0;
        int last=n-1;
        while(first<=last)
        {
            int mid=first+(last-first)/2;
            if(A[mid]==target) 
                return mid;
            
            if(A[first]<=A[mid])//左边有序
            {
                if(A[first]<=target&&target<A[mid])
                    last=mid-1;
                else
                    first=mid+1;
            }
            else//右边有序
            {
                 if(A[mid]<target&&target<=A[last])
                     first=mid+1;
                 else
                     last=mid-1;
                    
            }
        }
        
        return -1;
        
    }
};
感觉可以  你就给个赞

编辑于 2016-07-24 10:09:39 回复(11)

问题信息

难度:
0条回答 26300浏览

热门推荐

通过挑战的用户