码迷,mamicode.com
首页 > 其他好文 > 详细

leetcode第一刷_Search in Rotated Sorted Array

时间:2014-05-12 15:25:32      阅读:231      评论:0      收藏:0      [点我收藏+]

标签:c++   leetcode   算法   

旋转数组的查找问题。从头开始扫一遍,O(N)的复杂度,一般也能过,甚至先排序以下,再二分都能过。不过这道题的目的当然不在于此。

想一下旋转之后对我们的查找产生了什么影响。如果没旋转过,我们直接比较target与A[middle]的大小,然后总能非常确定的丢掉源数组的一半,即把搜索空间减半,但是旋转之后,只根据A[middle]是确定不了下一轮的走向的,因为即使A[middle]比target大,按理说我们应该往前找,但是如果源数组是循环左移的,较小的数可能在后半部分。

上面说的都是旋转之后与没旋转的区别,这个是很容易想明白的,关键是旋转之后有什么没有变化呢?答案是无论怎么旋转,middle的左右部分肯定至少有一个是完全有序的。这个应该好理解。怎么判断这一半是哪一半也很简单,只要看A[middle]跟A[0]和A[N]的大小关系就可以了。如果有序,我们就可以通过比较端点与target的大小来确定target应不应当在这一部分,如果不在的话,就递归查询另一半。根据这个策略,就可以每次确定的丢掉一半了,时间复杂度也就降下来了。

不要忘记这个题有很强的假设,数组中没有重复的元素,有重复元素的很不一样,是下一道题的内容。

int msearch(int A[], int n, int target, int* a){
    if(n<=0)
        return -1;
    int middle = n/2;
    if(A[middle] == target)
        return A-a+middle;
    if(A[middle]>target){
        if(A[0]<=target||A[0]>A[middle]){
            return msearch(A, middle, target, a);
        }else{
            return msearch(A+middle+1, n-middle-1, target, a);
        }
    }else{
        if(A[0]<=A[middle]||A[n-1]>=target)
            return msearch(A+middle+1, n-middle-1, target, a);
        else{
            return msearch(A, middle, target, a);
        }
    }
}


class Solution {
public:
    int search(int A[], int n, int target) {
        return msearch(A, n, target, A);
    }
};


leetcode第一刷_Search in Rotated Sorted Array,布布扣,bubuko.com

leetcode第一刷_Search in Rotated Sorted Array

标签:c++   leetcode   算法   

原文地址:http://blog.csdn.net/u012792219/article/details/25461437

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!