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;
}
}
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] Search in Rotated Sorted Array II
- 【Leetcode】Search in Rotated Sorted Array II
- leetcode_Search in Rotated Sorted Array II
- [leetcode] Search in Rotated Sorted Array II
- Search in Rotated Sorted Array II [LeetCode]
- LeetCode-Search in Rotated Sorted Array II
- leetcode 98: Search in Rotated Sorted Array II
- LeetCode Online Judge 题目C# 练习 - Search in Rotated Sorted Array II
- 【leetcode】Search in Rotated Sorted Array II
- [LeetCode] Search in Rotated Sorted Array II 解题报告
- [Leetcode] Search in Rotated Sorted Array II
- LeetCode-Search in Rotated Sorted Array II
- leetcode Search in Rotated Sorted Array II
- LeetCode Search in Rotated Sorted Array II
- LeetCode - Search in Rotated Sorted Array II
- LeetCode : Search in Rotated Sorted Array II
- 【Leetcode】Search in Rotated Sorted Array II
- leetcode - Search in Rotated Sorted Array II
- [LeetCode] Search in Rotated Sorted Array II
- [LeetCode]Search in Rotated Sorted Array II