leetcode做题总结,题目Search for a Range 2012/03/02
2014-08-15 10:30
489 查看
题目是求出一个有序列表有多个重复的target的第一个和最后一个的index,我的做法是先用二分找出其中一个target,然后向两边推进找出最前和最后的位置。
Update 2015/08/22: 上面的解法不对,不是logn,正确的解法是使用两次二分法找到对应的左、右节点。
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; } }
相关文章推荐
- leetcode做题总结,题目Search in Rotated Sorted Array I/II 2012/03/02-12/04/09
- leetcode做题总结,题目Search a 2D MatrixI/II 2012/04/06
- LeetCode Online Judge 题目C# 练习 - Search for a Range
- leetcode做题总结,题目Search Insert Position 2012/03/03
- leetcode做题总结,题目Convert Sorted List to Binary Search Tree 2012/10/02
- LeetCode 38: Search for a Range
- Leetcode Search for a Range
- LeetCode33:Search for a Range
- Leetcode: Search for a Range
- LeetCode | Search for a Range
- [leetcode] Search for a Range
- [LeetCode] Search for a Range
- LeetCode —— Search for a Range
- LeetCode-Search for a Range
- [LeetCode] Search for a Range
- [leetcode]Search for a Range
- [Leetcode] Search for a Range
- LeetCode - Search for a Range
- [LeetCode] Search in Rotated Sorted Array、Search for a Range、Search Insert Position、Search in Rotate
- [Leetcode] Search for a Range