zoukankan      html  css  js  c++  java
  • leetcode先刷_Search in Rotated Sorted Array II

    上一页下一页,找到相同的旋转阵列的问题。假设数组元素一再怎么办呢?会发生什么?

    我给大家举一个极端的例子。如果是这样的阵列中的元件。1,1,2,1,1,1,1,我们想看看这个数组2,刚开始A[middle]=1,发现超过target小,然后我们来看看A[0]和A[N],发现都跟A[middle]相等,那么这个2究竟在哪一半中?仅仅有上帝知道,如果他老人家真的存在的话。这种时候我们怎么办呢?没有其它的办法,仅仅能从头開始乖乖的扫描。直到发现target或者确定他不存在。

    为什么会出现这样的情况。或者说包括反复元素跟不包括反复元素在本质上有什么差别呢?这样的差别又是如何影响复杂度的呢?我认为差别在于,当A[middle]与两头的元素相等时,我们没法找到一半有序的元素,因此我们也就没法通过比較边界来确定target在不在这一半元素之中,也就是我们在每一轮的判定中,无法确定的扔掉一半元素,最坏情况下的复杂度自然就提高到了O(N)。

    编码上没有太大的差别,仅仅要当与两头元素都相等时,就仅仅移动左边的指针,逐个扫描过来,须要注意的是,每次移动时要判定这个值是否跟target的相等。

    class Solution {
    public:
        bool search(int A[], int n, int target) {
            int l = 0, r = n-1, mid;
            while(l<=r){
                mid = (l+r)/2;
                if(A[mid] == target)    return true;
                if(A[l]<A[mid]){
                    if(target>=A[l]&&target<A[mid])
                        r = mid-1;
                    else
                        l = mid+1;
                }else if(A[mid]<A[r]){
                    if(target>A[mid]&&target<=A[r])
                        l = mid+1;
                    else
                        r = mid-1;
                }else{
                    if(A[l] == target)  return true;
                    else    l++;
                }
            }
            return false;
        }
    };


    版权声明:本文博主原创文章。博客,未经同意,不得转载。

  • 相关阅读:
    Python处理时间 time && datetime 模块
    破解Mysql数据库密码
    JS一定要放在Body的最底部么?
    jQuery 层次选择器
    关于jquery中html()、text()、val()的区别
    解读JSP的解析过程
    JavaScript字符串分割方法
    maven install与maven package 的区别
    JSP起源、JSP的运行原理、JSP的执行过程
    Chrome隐身模式有什么用
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/4759437.html
Copyright © 2011-2022 走看看