本文共 1525 字,大约阅读时间需要 5 分钟。
我们需要找到一个数组 nums 中的目标值 target 的范围,即找到 target 的第一个和最后一个出现位置。如果 target 不在数组中,返回一个空数组。
我们可以定义一个辅助方法 extremeInsertionIndex,用于查找目标值 target 在数组中的开始位置或结束位置。这个方法有两个参数:
left 参数为 true 时,返回目标值的开始位置;false 时返回目标值的结束位置。初始化边界:
lo 设为 0;hi 设为数组长度。使用二分查找法:
mid;nums[mid] 大于目标值,说明目标值在左边界,更新右边界 hi 为 mid;nums[mid] 等于目标值,可能 mid 就是开始位置,更新右边界 hi 为 mid;lo。lo 和 hi; nums[mid] 大于目标值,更新右边界 hi 为 mid;nums[mid] 等于目标值,更新左边界 lo 为 mid + 1;hi 并减 1。class Solution { private int extremeInsertionIndex(int[] nums, int target, boolean left) { int lo = 0, hi = nums.length; while (lo < hi) { int mid = lo + (hi - lo) / 2; if (nums[mid] > target || (left && target == nums[mid])) { hi = mid; } else { lo = mid + 1; } } return lo; } public int[] searchRange(int[] nums, int target) { int[] result = {-1, -1}; int leftIdx = extremeInsertionIndex(nums, target, true); if (leftIdx == nums.length || nums[leftIdx] != target) { return result; } result[0] = leftIdx; result[1] = extremeInsertionIndex(nums, target, false) - 1; return result; }} 辅助方法 extremeInsertionIndex:
left 参数判断查找方向;主方法 searchRange:
-1;extremeInsertionIndex查找左边界;rightEnd - 1;通过这种方法,我们可以高效地找到目标值在数组中的范围,时间复杂度为 O(log n)。
转载地址:http://mwq.baihongyu.com/