您的位置:首页 > 其它

leetcode做题总结,题目Search for a Range 2012/03/02

2014-08-15 10:30 489 查看
题目是求出一个有序列表有多个重复的target的第一个和最后一个的index,我的做法是先用二分找出其中一个target,然后向两边推进找出最前和最后的位置。

public int[] searchRange(int[] A, int target) {
int[] res ={-1,-1};
if(A.length==0)return res;
int i=0, j=A.length-1, p=-1;
while(i<=j){
int m=(i+j)/2;
if(A[m]==target){
p=m;
break;
}
if(A[m]<target) i=m+1;
else j=m-1;
}
if(p==-1)return res;
i=p;
j=p;
while(i>=0&&A[i]==target){
i--;
}
while(j<=A.length-1&&A[j]==target){
j++;
}
res[0]=i+1;
res[1]=j-1;
return res;
}


Update 2015/08/22: 上面的解法不对,不是logn,正确的解法是使用两次二分法找到对应的左、右节点。

public class Solution {
/**
*@param A : an integer sorted array
*@param target :  an integer to be inserted
*return : a list of length 2, [index1, index2]
*/
public int search(ArrayList<Integer> A, int start, int end, boolean left, int target){
while (start <= end){
int mid = (start + end) / 2;
if (A.get(mid) == target){
if (left){
if (mid == 0 || A.get(mid) > A.get(mid - 1)){
return mid;
} else {
end = mid - 1;
}
} else {
if (mid == A.size() - 1 || A.get(mid) < A.get(mid + 1)){
return mid;
} else {
start = mid+1;
}
}
} else if (A.get(mid) < target){
start = mid+1;
} else {
end = mid-1;
}
}
return -1;

}

public ArrayList<Integer> searchRange(ArrayList<Integer> A, int target) {
// write your code here
ArrayList<Integer> res = new ArrayList<Integer>();
res.add(search(A, 0, A.size() - 1, true, target));
res.add(search(A, 0, A.size() - 1, false, target));
return res;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: