Javascript 按O(logn)的顺序查找排序数组中元素的第一个和最后一个位置

Javascript 按O(logn)的顺序查找排序数组中元素的第一个和最后一个位置,javascript,arrays,algorithm,time-complexity,Javascript,Arrays,Algorithm,Time Complexity,我正在做leetcode#34 给定按升序排序的整数nums数组,查找给定目标值的起始位置和结束位置 算法的运行时复杂度必须为O(logn) 如果在数组中找不到目标,则返回[-1,-1] 例1: 输入:nums=[5,7,7,8,8,10],目标=8 产出:[3,4] 例2: 输入:nums=[5,7,7,8,8,10],目标=6 输出:[-1,-1] var searchRange=函数(nums,目标){ var结果=[]; 结果[0]=findFirstIndex(nums,targe

我正在做leetcode#34

给定按升序排序的整数nums数组,查找给定目标值的起始位置和结束位置

算法的运行时复杂度必须为O(logn)

如果在数组中找不到目标,则返回[-1,-1]

例1:

输入:nums=[5,7,7,8,8,10],目标=8 产出:[3,4]

例2:

输入:nums=[5,7,7,8,8,10],目标=6 输出:[-1,-1]

var searchRange=函数(nums,目标){
var结果=[];
结果[0]=findFirstIndex(nums,target);
结果[1]=findLastIndex(nums,目标);
返回结果;
};
//[5,7,7,8,8,10],目标=10,中点=3
函数findFirstIndex(nums,目标){
var index=-1;//如果找不到,返回index=-1,将不会执行以下操作
var start=0;
var end=nums.length-1;
while(开始=目标){
结束=中点-1;
}否则{
起点=中点+1;
}
如果(nums[中点]==目标){
指数=中点;
}
}
收益指数;
}
函数findLastIndex(nums,目标){
var指数=-1;
var start=0;
var end=nums.length-1;

while(start您需要将
中点
取整为整数,否则您将尝试访问分数索引

var searchRange=函数(nums,目标){
var结果=[];
结果[0]=findFirstIndex(nums,target);
结果[1]=findLastIndex(nums,目标);
返回结果;
};
log(searchRange([5,7,8,8,8,10],8));
log(searchRange([5,7,8,8,8,10],10));
函数findFirstIndex(nums,目标){
var index=-1;//如果找不到,返回index=-1,将不会执行以下操作
var start=0;
var end=nums.length-1;
while(开始=目标){
结束=中点-1;
}否则{
起点=中点+1;
}
如果(nums[中点]==目标){
指数=中点;
}
}
收益指数;
}
函数findLastIndex(nums,目标){
var指数=-1;
var start=0;
var end=nums.length-1;

而(start实际上没有必要使用
findlastinex
方法。我稍微修改了@Barmar的解决方案

    var searchRange = function(nums, target) {
    if(nums.length == 0) return [-1,-1];
    var result = [];
    var index = findFirstIndex(nums, target);
    result[0] = index;
    var value = nums[index];

    while(nums[index] === value){index++}

    result[1] = index - 1;

    return result;
};
通过这种方法,我得到了
48ms,比JavaScript在线提交的96.65%要快


它不会提高总体
Big O
复杂度,但肯定会提高
一般情况下的
复杂度。

是的!它是有效的。如果您只需将
console.log(中点)放在
在循环中,您可能已经自己解决了这个问题。是的。数组长度有可能是偶数。这使得它为O(n)在最坏的情况下,考虑一个具有所有相等值的数组。@ vivik23,是的,正如我所说的,它将改进<代码>平均情况< /代码>复杂性。它并没有提高平均情况复杂度;平均情况下的复杂性仍然是O(log n)。它可以改善实际运行时间,但这不是“复杂性”意味着什么。