leetcode34.Search For A Range
题目要求
1 | Given an array of integers sorted in ascending order, find the starting and ending position of a given target value. |
即 在一个有序排列的数组中,找到目标值所在的起始下标和结束下标。如果该目标值不在数组中,则返回[-1,-1]
题目中有一个特殊要求是时间复杂度为O(logn),也就是在暗示我们,不能只是单纯的按照顺序遍历数组,要尽量减去无效遍历。所以这题的核心思路为二分法遍历。
思路一 二分法初级运用
最初的思路是使用二分法找到目标值的其中一个下标,再根据该下标左右遍历得出初始下标和结束下标。
1 | public int[] searchRange(int[] nums, int target) { |
思路二:二分法分别运用
假设我们目前有左指针,右指针,并判断中间值和目标值之间的关系,那么一共有三种关系情况
- 中间值小于目标值,则目标值只可能在右子数组
- 中间值大于目标值,则目标值只可能在左子数组
- 中间值等于目标值,则目标值在左右子数组都可能存在
结合情况1和情况3,当中间值小于目标值,则将左指针右移至中间,否则将右指针左移至中间。这样一定可以找到目标值的初始下标
同理,结合情况2和情况3,当中间值大于目标值,则将右指针左移至中间,否则将左指针右移至中间,这样一定可以找到目标值的结束下标。
1 | public int[] searchRange2(int[] nums, int target) { |
这种思路更清晰的代码表示如下
1 | public int[] searchRange3(int[] nums, int target) { |