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;
}
}
查到一篇博客,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;
}
}
相关文章推荐
- 81. Search in Rotated Sorted Array II
- LeetCode 81. Search in Rotated Sorted Array II
- 81. Search in Rotated Sorted Array II
- [LeetCode]81. Search in Rotated Sorted Array II
- [81]Search in Rotated Sorted Array II
- leetcode 81. Search in Rotated Sorted Array II 旋转数组查找+二分查找
- Medium 81题 Search in Rotated Sorted Array II
- 81. Search in Rotated Sorted Array II Leetcode Python
- leetcode 81. Search in Rotated Sorted Array II
- 81. Search in Rotated Sorted Array II
- 81 Search in Rotated Sorted Array II
- 81. Search in Rotated Sorted Array II
- 81. Search in Rotated Sorted Array II (Array; Divide-and-Conquer)
- 81.Search in Rotated Sorted Array II
- LeetCode 81. Search in Rotated Sorted Array II
- 81. Search in Rotated Sorted Array II
- Middle-题目48:81. Search in Rotated Sorted Array II
- 81. Search in Rotated Sorted Array II
- [leetcode] 81. Search in Rotated Sorted Array II
- Leetcode 81. Search in Rotated Sorted Array II