标签:Search lb target int mid Range result ub
Problem
Given a sorted array of n integers, find the starting and ending position ofa given target value. If the target is not found in the array, return [-1, -1].
Example
Given [5, 7, 7, 8, 8, 10] and target value 8, return [3, 4]
题解
lower/upper bound 的结合,做两次搜索即可。
JAVA:
import java.io.*; class test { public static void main (String[] args) throws java.lang.Exception { int arr[] = {5, 7, 7, 8, 8, 10}; int target = 8; int range[] = searchRange(arr, target); System.out.println("range is " + range[0] + " - " + range[1]); } public static int[] searchRange(int[] A, int target) { int[] result = new int[]{-1, -1}; if (A == null || A.length == 0) return result; int lb = -1, ub = A.length; // lower bound while (lb + 1 < ub) { int mid = lb + (ub - lb) / 2; if (A[mid] < target) { lb = mid; } else { ub = mid; } } // whether A[lb + 1] == target, check lb + 1 first if ((lb + 1 < A.length) && (A[lb + 1] == target)) { result[0] = lb + 1; } else { result[0] = -1; result[1] = -1; // target is not in the array return result; } // upper bound, since ub >= lb, we do not reset lb ub = A.length; while (lb + 1 < ub) { int mid = lb + (ub - lb) / 2; if (A[mid] > target) { ub = mid; } else { lb = mid; } } // target must exist in the array result[1] = ub - 1; return result; } }
输出:
range is 3 - 4
源码分析
1. 首先对输入做异常处理,数组为空或者长度为0
2. 分 lower/upper bound 两次搜索,注意如果在 lower bound 阶段未找到目标值时,upper bound 也一定找不到。
3. 取A[lb + 1]
时一定要注意判断索引是否越界!
复杂度分析
两次二分搜索,时间复杂度仍为 O(logn).
标签:Search,lb,target,int,mid,Range,result,ub 来源: https://www.cnblogs.com/lyc94620/p/12182845.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。