您的位置:首页 > 其它

81. Search in Rotated Sorted Array II

2016-11-20 13:43 417 查看
之前想先找出最小的值,在求出平移距离的思想现在行不通了,于是考虑其他的方法。

查到一篇博客,Search in Rotated Sorted Array, 说这样的数组有这样一个性质:

循环递增数组有这么一个性质:以数组中间元素将循环递增数组划分为两部分,则一部分为一个严格递增数组,而另一部分为一个更小的循环递增数组。

当中间元素大于首元素时,前半部分为严格递增数组,后半部分为循环递增数组;当中间元素小于首元素时,前半部分为循环递增数组;后半部分为严格递增数组。

于是仿照这个思路重新把没有重复数值的情况的算法实现一遍

public class Solution {
public int search(int[] nums, int target) {
int hi = nums.length-1, lo = 0, mid;
while(lo <= hi) {
mid = lo + (hi-lo) / 2;
if(nums[mid] == target) return mid;

// left is sorted
if(nums[mid] >= nums[lo]) {
if(target >= nums[lo] && target <= nums[mid])
hi = mid - 1;
else
lo = mid + 1;
}

//
else if(nums[mid] < nums[lo]) {
if(target >= nums[mid] && target <= nums[hi])
lo = mid + 1;
else
hi = mid - 1;
}

}
return -1;
}
}

接着考虑有重复的情况,博客Search in Rotated Sorted Array II 是这样说的:

如果A[start] <= A[mid] 条件就不能确定[start mid]区间为递增有序序列,我们就把该条件分成两个字条件:

A[start] < A[mid] 则 [start mid]区间为递增有序序列

A[start] = A[mid] 则[start mid]区间不能确定,那就start++,往下一步看看即可。

值得注意的是start++,而不是end--, 因为A[start] = A[mid],而 A[mid]!=target,所以A[start] !=target

public class Solution {
public boolean search(int[] nums, int target) {
int hi = nums.length-1, lo = 0, mid;
while(lo <= hi) {
mid = lo + (hi-lo) / 2;
if(nums[mid] == target) return true;

// left is sorted
if(nums[mid] > nums[lo]) {
if(target >= nums[lo] && target <= nums[mid])
hi = mid - 1;
else
lo = mid + 1;
}

// right is sorted
else if(nums[mid] < nums[lo]) {
if(target >= nums[mid] && target <= nums[hi])
lo = mid + 1;
else
hi = mid - 1;
}

// lo will not be target, because nums[mid] != target
else if(nums[mid] == nums[lo])
lo ++;
}
return false;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: