在排序数组中查找元素的起始位置
题目: 给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target,返回 [-1, -1]。 进阶: 你可以设计并实现时间复杂度为 O(log n) 的算法解决此问题吗?
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array
题解:
要实现时间复杂度为O(logn)就要利用折半查找的原理取中间值,中间值大于目标值则在下半范围查找;中间值小于目标值则在上半范围查找。记录起点s和结束点e缩短范围查找。map用来记录已经折半查找过得值,存在已经查找的值则是重复查找,说明数组中不存在该值
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var searchRange = function(nums, target) {
let m = Math.floor(nums.length / 2), s = 0, e = nums.length, res = [-1,-1], map = {};
while(true) {
if(map[m] != undefined) break;
map[m] = '';
if(nums[m] == target) {
let end = m, start = m;
while(end <= e && nums[end] == target) {
end++;
}
while(start > s && nums[start] == target) {
start--;
}
res = [nums[start] == target ? start : start + 1, nums[end] == target ? end : end - 1];
break;
}else if(nums[m] < target) {
s = m;
m = Math.floor((m + e) / 2);
}else if(nums[m] > target) {
e = m;
m = Math.floor((m + s) / 2);
}
}
return res;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
上次更新: 2025/09/05, 8:09:00