从0开始的秋招刷题路,记录下所刷每道题的题解,帮助自己回顾总结
34. 在排序数组中查找元素的第一个和最后一个位置(Mid)
-
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。
-
**进阶:你可以设计并实现时间复杂度为 O(log n) **的算法解决此问题吗?
-
示例 1:
输入:nums = [5,7,7,8,8,10], target = 8
输出:[3,4] -
示例 2:
输入:nums = [5,7,7,8,8,10], target = 6
输出:[-1,-1] -
示例 3:
输入:nums = [], target = 0
输出:[-1,-1] -
提示:
0 <= nums.length <= 10^5
-10^9 <= nums[i] <= 10^9
nums 是一个非递减数组
-10^9 <= target <= 10^9 -
二分查找
- 寻找左右边界,即nums[mid] == target 时,查找方向分别向左或者向右即可
class Solution { public int[] searchRange(int[] nums, int target) { int n = nums.length; int l = 0, r = n - 1, mid; int start = -1, end = -1; while (l <= r) { mid = l + (r - l) / 2; if (nums[mid] == target) { start = mid; r = mid - 1; } else if (nums[mid] > target) r = mid - 1; else l = mid + 1; } l = 0; r = n - 1; while (l <= r) { mid = l + (r - l) / 2; if (nums[mid] == target) { end = mid; l = mid + 1; } else if (nums[mid] > target) r = mid - 1; else l = mid + 1; } return new int[]{start, end}; } }