leetcode6:Search in Rotated Sorted Array

Search in Rotated Sorted Array


题目连接:https://oj.leetcode.com/problems/search-in-rotated-sorted-array/

runtimes:7ms


一、问题

         Suppose a sorted array is rotated at some pivot unknown to you beforehand. 

         (i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2). You are given a target value to search. 

         If found in the array return its index, otherwise return -1.

         即有个循环数组,在其中找target元素,如果找到了返回index,找不到返回-1。

二、分析

        这个问题有点水,你如果按照传统的思维从头扫描到尾只需要O(n)的时间,但是题目tip给出了binary search的字样,需要琢磨一下如何利用分支策略寻找,如果真的可以用那么就可以讲O(n)降成O(logN)的时间。分治思想如何运作的呢?首先对数组A的中间元素和target进行比较,是的话返回,不是的话找到递增的那一部分,如果元素在递增的部分,那么就继续按照分治思想搜索在递增部分中搜索target;否则就回到了原问题的子问题,即在数组A的子数组(A的非递增另外一部分)中搜索target。以此类推,直到找到target元素返回index或者返回-1为之。

三、小结

         如上面分析所述,用从头扫描到尾的方法就可以在O(n)的时间内找到结果;

        但是如果用分治思想的话,可以如此设计:搜索数组A,取A中间元素,如果等于target,返回index。如果不等,找出递增的那一部分子数组,假如是左边,则检测target是否在递增中,如果是,就继续递归搜索左边;否则搜索右边非递增部分,此时该问题也是原问题的子问题,即在数组A的子数组中搜索target元素。以此类推,直至得到结果。

四、方案

传统实现方案:

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 mySearch(int A[], int n, int target, int l, int r)
    {
        if(l > r)
            return -1;
        int mid = (l + r) / 2;
        bool isLeft;
        if(A[mid] == target)
            return mid;
        else if(A[l] <= A[mid])
        {
            if(A[l] <= target && A[mid] > target)
            {
                isLeft = true;
                int mid2 = (l + mid) / 2;
                if(target == A[mid2])
                    return mid2;
                else if(target < A[mid2])
                    return mySearch(A, n, target, l, mid2 - 1);
                else if(target > A[mid2])
                    return mySearch(A, n, target, mid2 + 1, mid - 1);
            }else{
                isLeft = false;
            }
            
        }else if(A[mid] <= A[r])
        {
            if(A[mid] < target && A[r] >= target)
            {
                isLeft = false;
                int mid2 = (mid + r) / 2;
                if(target == A[mid2])
                    return mid2;
                else if(target < A[mid2])
                    return mySearch(A, n, target, mid + 1, mid2 - 1);
                else if(target > A[mid2])
                    return mySearch(A, n, target, mid2 + 1, r);
            }else{
                isLeft = true;
            }
        }
        if(isLeft)
            return mySearch(A, n, target, l, mid - 1);
        else
            return mySearch(A, n, target, mid + 1, r);
    }
    
    int search(int A[], int n, int target) {
        return mySearch(A, n, target, 0, n - 1);
    }
};

五、三思

         一篇不错的文章,先mark一下。但是即使运用了分治思想,还是运行时间10ms大于传统思想,有可能是因为递归原因导致的,如果改成非递归估计会得到更快的结果。嗯,应该是酱紫。

        原文链接:http://log4think.com/binary_search_sorted_loop_array/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值