二分查找
在排序数组中查找元素的第一个和最后一个位置
34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode)
给你一个按照非递减顺序排列的整数数组
nums
,和一个目标值target
。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值
target
,返回[-1, -1]
。你必须设计并实现时间复杂度为
O(log n)
的算法解决此问题。示例 1:
1
2 输入:nums = [5,7,7,8,8,10], target = 8
输出:[3,4]示例 2:
1
2 输入:nums = [5,7,7,8,8,10], target = 6
输出:[-1,-1]示例 3:
1
2 输入:nums = [], target = 0
输出:[-1,-1]提示:
0 <= nums.length <= 10^5
-10^9 <= nums[i] <= 10^9
nums
是一个非递减数组-10^9 <= target <= 10^9
注意到题目中提到数组元素按非递减顺序排序,则可以采用二分查找法。
首先实现方法int lowerBound(int[] nums, int target)
:给定一个按照非递减顺序排列的整数数组 nums
,和一个目标值 target
,找出第一个大于等于target
的数的位置。那么可以将其他问题使用该方法解决:
- 找出第一个大于
target
的数的位置:lowerBound(nums, target+1)
找出最后一个小于
target
的数位置:lowerBound(nums, target)-1
找出最后一个小于等于
target
的数位置:lowerBound(nums, target+1)-1
这里使用两侧开区间的循环不变式,即(left, right)
,循环不变式中所有在left
以及left
左边的数都必定严格小于target
,所有在right
以及right
右边的数都必定大于等于target
,则代码可写为:
1 | class Solution { |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Eternity's Blog!