34. Search for a Range
Tags
- Array
- Binary Search
Given an array of integers sorted in ascending order, find the starting and ending position of a given target value.
Your algorithm's runtime complexity must be in the order of O(log n).
If the target is not found in the array, return [-1, -1].
For example, Given [5, 7, 7, 8, 8, 10] and target value 8, return [3, 4].
题意:
给你一个升序排列的整数数组,找到指定数字的起始和结尾位置,你的算法运行时间必须为O(log n)。如果目标值没有在数组中找到就返回[-1,-1].
分析:
参考33题
思路:
二分查找,进行两次分别找到起始和结尾
复杂度:
时间复杂度O(log(n));
Js实现:
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var searchRange = function(nums, target) {
const start = targetPos(target,nums, false);
const end = targetPos(target, nums, true);
return [start, end];
};
function targetPos(target, nums, isLast) {
let lo = 0;
let hi = nums.length - 1;
let pos = -1;
while(lo <= hi) {
let mid = Math.floor((hi+lo)/2);
if(nums[mid] == target) pos = mid;
if(isLast) {
if(nums[mid] <= target) {
lo = mid + 1;
} else {
hi = mid - 1;
}
} else {
if(nums[mid] < target) {
lo = mid + 1;
} else {
hi = mid - 1;
}
}
}
return pos;
}