Search in Rotated Sorted Array II

题目

Follow up for "Search in Rotated Sorted Array":
What if duplicates are allowed?

Would this affect the run-time complexity? How and why?

Write a function to determine if a given target is in the array.

思路

递归

class Solution {
public:
    bool search(int A[], int n, int target) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        return fun(A,0,n-1,target);
               
    }
    
    bool fun(int A[], int left, int right, int target)
    {
        if(left>right)
            return false;
        int mid = (left+right)/2;
        if(A[mid]==target)
            return true;
            
        if(A[left]<A[mid])  
        {  
            if(A[left]<=target && target<A[mid])  
                return fun(A,left,mid-1,target);  
            else  
                return fun(A,mid+1,right,target);
        }
        else if(A[left]>A[mid])   
        {  
                if(A[mid]<target && target<=A[right])  
                    return fun(A,mid+1,right,target);  
                else   
                    return fun(A,left,mid-1,target);     
            }  
        else
             return fun(A,left+1,right,target);
    }    
};


迭代

bool search(int A[], int n, int key) {
    int l = 0, r = n - 1;
    while (l <= r) {
        int m = l + (r - l)/2;
        if (A[m] == key) return true; //return m in Search in Rotated Array I
        if (A[l] < A[m]) { //left half is sorted
            if (A[l] <= key && key < A[m])
                r = m - 1;
            else
                l = m + 1;
        } else if (A[l] > A[m]) { //right half is sorted
            if (A[m] < key && key <= A[r])
                l = m + 1;
            else
                r = m - 1;
        } else l++;
    }
    return false;
}

 

代码三

public boolean search(int[] A, int left, int right, int target) {
      while (left <= right && left >= 0 && right < A.length) {
           int mid = (left + right) / 2;
           if (A[mid] == target)
                return true;
           if (A[left] == A[right]) {
                return search(A, left, mid - 1, target)
                          || search(A, mid + 1, right, target);
           }

           if (A[mid] >= A[left]) { // left is sorted
                if (target >= A[left] && target <= A[mid])
                     right = mid - 1;
                else
                     left = mid + 1;
           } else { // right is sorted
                if (target >= A[mid] && target <= A[right])
                     left = mid + 1;
                else
                     right = mid - 1;
           }
      }
      return false;

 }

 public boolean search(int[] A, int target) {
      return search(A, 0, A.length - 1, target);
 }


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值