您的位置:首页 > 其它

LeetCode 71 Search in Rotated Sorted Array II

2014-09-09 19:52 429 查看
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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息