1、题目
34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode)
2、实现
(1)思路
核心的就是:将题目中查找target最后一次出现的位置进行转化:转化为查找target+1第一次出现的位置,然后用这个位置减去1,就得到了target最后一次出现的位置。
找到一个target在数组中第一次出现的位置,满足二分性质,可以使用二分法进行查找。二分的条件就是,判断mid对应的元素与target的大小关系。
(2)代码
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var searchRange = function(nums, target) {
let firstIndex = findFirstTarget(nums, target);
// target最后一次出现的位置可以转换为:target+1第一次出现的位置减去1
let lastIndex = findFirstTarget(nums, target + 1) - 1;
if(firstIndex === nums.length || nums[firstIndex] !== target) {
return [-1,-1];
} else {
return [firstIndex, lastIndex];
}
};
// 二分法查找封装 -- 查找target第一次出现的位置
function findFirstTarget(nums, target) {
// 注意,右指针为n指向的位置而不是n-1指向的位置
let l = 0, r = nums.length;
while(l < r) {
let mid = Math.floor(l + (r - l) / 2);
if(nums[mid] >= target) {
// 说明target在mid的左侧,可以等于mid
r = mid;
} else {
// target在mid右侧
l = mid + 1;
}
}
return r;
}
3、参考
【300题刷题挑战】leetcode力扣34 在排序数组中查找元素的第一个和最后一个位置 searchRange 第二十八题 | 二分查找_哔哩哔哩_bilibili
在排序数组中查找元素的第一个和最后一个位置 - 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode)