条件:给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。你的算法时间复杂度必须是 O(log n) 级别。
例如:输入:nums = [5,7,7,8,8,10], target = 8 输出:[3,4] 输入nums = [5,7,7,8,8,10], target = 6,输出[-1,-1],
思路:时间复杂度必须是O(log n) 级别,强烈暗示了“二分法查询”算法,升序更是省下了排序时间
所以第一步,利用升序数组的二分法查询,查出目标值所在区间,如果
1、所选中的中间值大于目标值target,则左边界的元素索引为mid+1,
2、所选中的中间值大于目标值target,则右边界的元素索引为mid-1
3、若与目标值相等,则用while循环分别将指针前移、后移,分别指向第一个和最后一个与目标值相等元素的索引号。
4、若遍历元素无符合条件的元素,则返回[-1,-1]。
var search = function(nums, target) {
let l = 0;
let r = nums.length-1;
var arr = [];
while(l<=r){ //最佳搭配
var mid = (l+r) >>> 1; //最佳获取中间值的方法
if(nums[mid]<target){
l=mid+1;
}else if(nums[mid]>target){
r=mid-1;
}
if(nums[mid]==target){
var i = mid;
var j = mid;
while(nums[j]==target){
arr[0]=j;
j--;
}
while(nums[i]==target){
arr[1]=i;
i++;
}
return arr;
}
}
return [-1,-1];
};
网友评论