题目:
分析:看到排序数组的查找问题,就要想到二分查找。旋转排序数组其实是由两个递增子数组组成,且前一个子数组中的任意元素都大于后一个数组中元素。left,right分别是指向数组首尾的两个指针。
循环条件:left<=right
- 若A[mid]==target,表示
- 若A[mid]>A[left],表示left与mid均处于前一个递增数组中。
若target>=A[left]且target<A[mid],则right=mid-1;否则,left=mid+1;
3. 若A[mid]<A[left],表示right与mid均处于前一个递增数组中。
若target>A[mid]且target<=A[right],则left=mid+1;否则,right=mid-1;
public class Solution {
/**
* @param A: an integer rotated sorted array
* @param target: an integer to be searched
* @return: an integer
*/
public int search(int[] A, int target) {
// write your code here
if(A.length==0 || A==null) return -1;
int len=A.length;
int left=0,right=len-1;
while(left<=right){
//注意到前面的递增子序列中任意元素都大于后面的递增子序列
int mid=(left+right)/2;
if(A[mid]==target){
return mid;
}else if(A[mid]>A[left]){ //中间元素大于left位置,表示中间元素和位于前面递增子序列中
if(target>=A[left] && target<A[mid]){ //正常的二分查找
right=mid-1;
}else{
left=mid+1;
}
}else{ //中间元素小于left位置,表示中间元素位于后面递增子序列中
if(target>A[mid] && target<=A[right]){
left=mid+1;
}else{
right=mid-1;
}
}
}
return -1;
}
}
思路同62一样,题面的区别是62中数组不存在相同元素,63是数组存在相同元素,同样采用二分查找的方法,需要额外考虑一种情况:
当A[mid]==A[left]时,表示mid与left的数值相同,因为存在相同元素的原因,所以left与mid之间的数组并不一定是递增的,所以此时需要顺序查找A[left:mid-1],所以left++;比如[1,0,1,1,1]的情况,A[left]=A[mid]=1。
public class Solution {
/**
* @param A: an integer ratated sorted array and duplicates are allowed
* @param target: An integer
* @return: a boolean
*/
public boolean search(int[] A, int target) {
// write your code here
if(A.length==0 || A==null) return false;
int len=A.length;
int left=0,right=len-1;
while(left<=right){
int mid=(left+right)/2;
if(A[mid]==target){
return true;
}else if(A[mid]>A[left]){
if(target<A[mid] && target>=A[left]){
right=mid-1;
}else{
left=mid+1;
}
}else if (A[mid]<A[left]){
if(target<=A[right] && target>A[mid]){
left=mid+1;
}else{
right=mid-1;
}
}else{ //A[mid]==A[left]
left++;
}
}
return false;
}
}