题目

搜索旋转排序数组 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;
    }
}