您的位置:首页 > 其它

33. Search in Rotated Sorted Array && 81. Search in Rotated Sorted Array II

2016-01-11 11:16 603 查看
Suppose a sorted array is rotated at some pivot unknown to you beforehand.

(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).

You are given a target value to search. If found in the array return its index, otherwise return -1.

You may assume no duplicate exists in the array.

思路

二分查找。不需要找出拐点,mid将数组分成left~mid,mid~right两部分,拐点只有一个,如下图所示,由于不存在重复数字,这两部分一定有一部分是有序的,在有序的部分里寻找target,如果不在有序的部分里,就肯定在另一部分。



public class Solution {
public int search(int[] A, int target) {
if (A == null || A.length == 0) return -1;
int left = 0;
int right = A.length - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (A[mid] == target) {
return mid;
}
if (A[left] <= A[mid]) {         //left~mid有序
if (A[left] <= target && target < A[mid]) {
right = mid - 1;
} else {
left = mid + 1;
}
} else {                        //mid~right有序
if (A[mid] < target && target <= A[right]) {
left = mid + 1;
} else {
right = mid - 1;
}
}
}
return -1;
}
}


82 Search in Rotated Sorted Array II题目中数组有可能出现重复数字就要复杂一点,mid将数组分成left~mid,mid~right两部分后,有可能不能确定两部分的有序性。如下图,如果left、mid、right三个点是图中三个红点,两部分的有序性就完全无法确定。这是只能right–,left++来找下一个位置。



这个问题里对于两部分的有序性的判断要更加严格。

1、left~mid有序的充要条件:A[left] < A[mid] || A[right] < A[mid].两部分肯定有一部分是有序的,前一个条件证明left~mid有序,后一个条件是mid~right无序,都能确定left~mid有序

2、反之,mid~right有序的充要条件:A[mid] < A[right] || A[left] >A[mid].

3.如果以上两个条件都不成立。那么久出现了图中的情况。A[left] = A[right] = A[mid].只能right–,left++之后判断了

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 - left) / 2;
if (A[mid] == target) {
return true;
}
if (A[left] < A[mid] || A[right] < A[mid]) {         //left~mid有序或者mid~right无序
if (A[left] <= target && target < A[mid]) {
right = mid - 1;
} else {
left = mid + 1;
}
} else if(A[right] > A[mid] || A[left] > A[mid]){     //mid~right有序或者left~mid无序
if (A[mid] < target && target <= A[right]) {
left = mid + 1;
} else {
right = mid - 1;
}
}
else{           //A[mid] == A[left] = A[right]
right--;
left++;
}
}
return false;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: