LeetCode 71 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.

分析:

先来一个连接:Search in Rotated Sorted Array

题目的意思就是,现在有一个排好序的数组,但是可能从中间断开把后面部分移到前面了。

排序数组的查找应该用二分。

最然不是完全排序,但是仍然保存了顺序信息。

就是,如果

A[mid] > A[left] 那么左边一定是有序的

A[mid] < A[left] 那么右边一定是有序的

根据这个可是实施二分。

这道题麻烦的地方是,可能有重复元素,即可能出现

A[mid] == A[left]

在这种情况下,无法判断是左边有序还是右边有序,这里采取的策略是,

只要相等,就让左边界右移,直到出现不相等,因为只有不相等出现的时候,才能判断是左边有序还是右边有序。

下面代码有参考这篇文章:来个链接。

public class Solution {
    public boolean search(int[] A, int target) {
        if(A==null || A.length==0) return false;
        int left = 0;
        int right = A.length-1;
        while(left <= right){
            int mid = (left+right)/2;
            if(A[mid] == target)
                return true;
            //中间大于左边,说明左半部分是有序的
            if(A[mid] > A[left]){
                //大于左边界小于右边界则在左半部分
                if(A[mid]>target && A[left]<=target)
                    right = mid-1;
                else
                //否则在右半部分
                    left = mid+1;
            //中间小于右边,说明右半部分是有序的
            }else if(A[mid] < A[left]){
                
                if(A[mid]<target && A[right]>=target)
                    left = mid+1;
                else
                    right = mid-1;
            }else{
                //不同之处在这里,由于存在重复,当相等的时候无法判断左边有序还是右边有序
                //这里采取的措施是左边界不断右移知道出现不相等的情况
                left++;
            }
        }
        return false;
    }
}


你可能感兴趣的:(LeetCode,in,search,so,rotated)