一、题目地址
https://leetcode-cn.com/problems/zai-pai-xu-shu-zu-zhong-cha-zhao-shu-zi-lcof/
二、具体代码
/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
// 两次二分搜索法,暂未优化,可提取公共代码
// 时间复杂度: O(logn)
// 空间复杂度: O(1)
var search = function(nums, target) {
let i = 0, j = nums.length - 1;
// 寻找右边界right
while(i <= j) {
let m = Math.trunc((i + j) / 2);
if(nums[m] <= target) {
i = m + 1;
}else {
j = m - 1;
}
}
let right = i;
if(j >= 0 && nums[j] !== target) {
return 0;
}
i = 0, j = nums.length - 1;
// 寻找左边界left
while(i <= j) {
let m = Math.trunc((i + j) / 2);
if(nums[m] < target) {
i = m + 1;
}else {
j = m - 1;
}
}
let left = j;
return right - left - 1;
};
/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
// 两次二分搜索法,优化版
// 时间复杂度: O(logn)
// 空间复杂度: O(1)
var search = function(nums, target) {
return helper(nums, target) - helper(nums, target - 1);
};
function helper(nums, target) {
let i = 0, j = nums.length - 1;
// 寻找右边界right
while(i <= j) {
let m = Math.trunc((i + j) / 2);
if(nums[m] <= target) {
i = m + 1;
}else {
j = m - 1;
}
}
return i;
}
三、补充链接
四、补充部分
关注公众号:【深漂程序员小庄】:
内含丰富的学习资源和面试经验(不限前端、java),还有学习交流群可加,并且还有各大厂大佬可一起交流学习,一起进步~添加小庄微信,回复【加群】,可加入互联网技术交流群: