/*** leetcode #34 在排序数组中查找元素的第一个和最后一个位置* https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array/** 给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。* 你的算法时间复杂度必须是 O(log n) 级别。* 如果数组中不存在目标值,返回 [-1, -1]** 输入: nums = [5,7,7,8,8,10], target = 8* 输出: [3,4]** 输入: nums = [5,7,7,8,8,10], target = 6* 输出: [-1,-1]* **/// 由于数组已经排序,因此整个数组是单调递增的,我们可以利用二分法来加速查找的过程。// 考虑target 开始和结束位置,// 其实我们要找的就是数组中「第一个等于target 的位置」(记为 leftIdx)// 和「第一个大于target 的位置减一」(记为 rightIdx)。// 二分查找中,寻找 leftIdx 即为在数组中寻找第一个大于等于 target 的下标,// 寻找 rightIdx 即为在数组中寻找第一个大于 target// binarySearch(nums, target, lower) 表示在 nums 数组中二分查找 target 的位置,如果 lower 为true,// 则查找第一个大于等于 target 的下标,否则查找第一个大于 target 的下标。// 最后,因为 target 可能不存在数组中,// 因此我们需要重新校验我们得到的两个下标 leftIdx 和 rightIdx,// 看是否符合条件,如果符合条件就返回 [leftIdx,rightIdx],不符合就返回 [−1,−1]。function searchRange(nums, target) {let res = [-1, -1];const leftIndex = binarySearch(nums, target, true);const rightIndex = binarySearch(nums, target, false) - 1;if (leftIndex <= rightIndex && rightIndex < nums.length && nums[leftIndex] == target && nums[rightIndex] == target) {res = [leftIndex, rightIndex]}return res};function binarySearch(nums, target, lower) {let left = 0,right = nums.length - 1,ans = nums.length;while (left <= right) {const m = Math.floor((left + right) / 2)if (nums[m] > target || (lower && nums[m] >= target)) {right = m - 1ans = m} else {left = m + 1}}return ans}
