leetcode做题总结,题目Search for a Range 2012/03/02
来源:互联网 发布:淘宝网商城女装夏装 编辑:程序博客网 时间:2024/05/24 06:34
题目是求出一个有序列表有多个重复的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; }}
0 0
- leetcode做题总结,题目Search for a Range 2012/03/02
- 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 for a Range
- Search for a Range leetcode
- 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
- 由性能优化引起的活锁现象
- GetProcAddressEx跨进程获取导出函数地址
- js visibility和display区别(附代码实例)
- [android基础知识] 之八:线程的使用之Handler
- JNDI的一篇文章
- leetcode做题总结,题目Search for a Range 2012/03/02
- .jar包下载网址
- Maven系列1--settings.xml 配置详解
- 系统是实时嵌入式操作系统,具有实时、
- 三种算法实现字符串拷贝
- 关于数组的若干练习
- 工作安排及总结 2014 08 14
- jquery-1.11.1.min.js与jquery.min.js有红色的叉号
- php获取apk包信息