您的位置:首页 > 其它

leetcode做题总结,题目Search in Rotated Sorted Array I/II 2012/03/02-12/04/09

2014-08-17 08:44 513 查看
从类似45678123这样的有序数组中寻找对应的target,思路是还是按照普通的二分查找,然后再求出中间值mid后将其转换对应到数组中的index,然后进行比较或者返回。

public int search(int[] A, int target) {
if(A.length==0)return -1;
if(A.length==1){
if(A[0]==target)return 0;
else return -1;
}
int qian=1;
for(int i=0;i<A.length-1;i++){
if(A[i]>A[i+1])break;
qian=i+2;
}
int hou=A.length-qian;
int i=0,j=A.length-1,chan;
while(i<=j){
int mid=(i+j)/2;
if(mid<hou)chan=mid+qian;
else chan = mid-hou;
//if(hou==0)chan=mid;
if(A[chan]==target)return chan;
if(A[chan]>target) j=mid-1;
else i=mid+1;
}
return -1;
}


第二题在第一题的基础上添加了数组中可能有重复元素,问是否影响复杂度,我觉得会降低复杂度,因为对于相同长度的数组,如果有重复数,相应的二分的命中几率就会大,次数就会少。

public boolean search(int[] A, int target) {
if(A.length==0)return false;
if(A.length==1){
if(A[0]==target)return true;
else return false;
}
int qian=1;
for(int i=0;i<A.length-1;i++){
if(A[i]>A[i+1])break;
qian=i+2;
}
int hou=A.length-qian;
int i=0,j=A.length-1,chan;
while(i<=j){
int mid=(i+j)/2;
if(mid<hou)chan=mid+qian;
else chan = mid-hou;
//if(hou==0)chan=mid;
if(A[chan]==target)return true;
if(A[chan]>target) j=mid-1;
else i=mid+1;
}
return false;
}


Update 2015/08/23:下面是新的代码,注意数组判断长度是否为0和判断对象是否为空一样重要。

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)return -1;

int i=0,j=A.length-1;
int s = A[i];
int e = A[j];
while(i<=j){
int mid=(i+j)/2;
if (A[mid] == target)
return mid;
else if (A[mid] >= A[i]){
if (target >= A[i] && target < A[mid])
j = mid - 1;
else
i = mid + 1;
} else {
if (target <= A[j] && target > A[mid])
i = mid + 1;
else
j = mid - 1;
}
}
return -1;
}
}


public class Solution {
/**
* param A : an integer ratated sorted array and duplicates are allowed
* param target :  an integer to be search
* return : a boolean
*/
public boolean search(int[] A, int target) {
// write your code here
if(A.length==0)return false;

int i=0,j=A.length-1;
int s = A[i];
int e = A[j];
while(i<=j){
int mid=(i+j)/2;
if (A[mid] == target)
return true;
else if (A[mid] > A[i]){
if (A[i] <= target && target < A[mid])
j = mid - 1;
else
i = mid + 1;
} else if (A[mid] < A[i]){
if (target <= A[j] && A[mid] < target)
i = mid + 1;
else
j = mid - 1;
} else
i++;
}
return false;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: