zoukankan      html  css  js  c++  java
  • lintcode 中等题:搜索旋转排序数组II

    题目

    搜索旋转排序数组 II

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

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

    如何影响?

    为何会影响?

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

    样例

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

    解题

    直接法

    class Solution:
        """
        @param A : an integer ratated sorted array and duplicates are allowed
        @param target : an integer to be searched
        @return : a boolean
        """
        def search(self, A, target):
            # write your code here
            if target in A:
                return True
            return False

    如果二分法岂不是好多判断条件

    public class Solution {
        /** 
         * param A : an integer ratated sorted array and duplicates are allowed
         * param target :  an integer to be search
         * return : a boolean 
         */
        public boolean search(int[] A, int target) {
            // write your code here
            if(A == null || A.length == 0)
                return false;
            for(int i = 0;i<A.length;i++){
                if(A[i] == target)
                    return true;
            }
            return false;
        }
    }

     半个二分

    三个数相等的适合线性查找

    public class Solution {
        /** 
         * param A : an integer ratated sorted array and duplicates are allowed
         * param target :  an integer to be search
         * return : a boolean 
         */
        public boolean search(int[] A, int target) {
            // write your code here
            if(A==null)
                return false;
            int n = A.length -1;
            return search(A,0,n,target);
        }
        public boolean search(int[] A,int left,int right,int target){
            if(left>right)
                return false;
            if(A[left] == target || A[right] == target)
                return true;
            int i = left;
            int j = right;
            while(i<=j){
                int mid = (i+j)>>1;
                // 线性查找
                if(A[i]==A[j]&&A[i]==A[mid])
                    return searchLine(A,i,j,target);
                if(A[mid] == target){ // 相等 
                    return true;
                }else if(A[mid] <= A[right]){ // i mid j right mid在右边升序的序列中
                    if(A[mid] == A[right])
                        return search(A,i+1,mid-1,target);
                    else
                        return search(A,i+1,mid-1,target) || search(A,mid+1,j,target);
                    
                }else {
                    return search(A,i+1,mid-1,target);
                }
            }
            return false;
        }
        // 线性查找
        public boolean searchLine(int[] A,int i,int j,int target){
            for(;i<=j;i++)
                if(A[i] ==target)
                    return true;
            return false;
        }
    }
  • 相关阅读:
    ViewPager部分源码分析二:FragmentManager对Fragment状态的管理完成ViewPager的child添加或移出
    ViewPager部分源码分析一:加载数据
    Android View的scrollTo(),scrollBy(),getScrollX(),getScrollY()
    关于android的单位dp与px
    ListView + PopupWindow实现滑动删除
    Android自学指导
    Ubuntu 14.04 Trusty安装java环境
    Git+VirtalBaox+Vagrant创建Linux虚拟机
    ListView介绍
    Load store and memoryless
  • 原文地址:https://www.cnblogs.com/theskulls/p/5111087.html
Copyright © 2011-2022 走看看