题目:
Given an array of integers nums sorted in non-decreasing order, find the starting and ending position of a given target value.
If target is not found in the array, return [-1, -1].
You must write an algorithm with O(log n) runtime complexity.
Example 1:
Input: nums = [5,7,7,8,8,10], target = 8
Output: [3,4]
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
//let arr = []; //创建一个空数组
//let arr2 = [1, 2, 3]; //创建一个有三个元素的数组
//let arr = new Array(); //创建一个空数组
//let arr2 = new Array(1, 2, 3); //创建一个有三个元素的数组
var searchRange = function(nums, target) {
//先new一个数组保存第一个or最后一个,用作返回
let answer = [];
answer[0]=findFirst(nums,target);
answer[1]=findLast(nums,target);
return answer;
function findFirst(nums,target){
let left=0;
let right=nums.length-1;
while(left<=right){
let mid=Math.floor(left+(right-left)/2);
if(nums[mid]>target){
right=mid-1;
}
else if(nums[mid]<target){
left=mid+1;
}
else { //这里等于target的值已经找到了,判断是不是第一个;
//因为是升序数组,所以它前面一个不一样,即为第一个
//要判断临界值!! 比如第一个最后一个当然是第一个值和最后一个值;
if(mid==0 || nums[mid-1] != target){
return mid;
}
else{
right=mid-1;
}
}
}
return -1; //!! 根据题意 别忘记没有就返回-1 !!;
}
function findLast(nums,target){
let left=0;
let right=nums.length-1;
while(left<=right){
let mid=Math.floor(left+(right-left)/2);
if(nums[mid]>target){
right=mid-1;
}
else if(nums[mid]<target){
left=mid+1;
}
else { //这里等于target的值已经找到了,判断是不是第一个;
//因为是升序数组,所以它前面一个不一样,即为第一个
//要判断临界值!! 比如第一个最后一个当然是第一个值和最后一个值;
if(mid==nums.length-1 || nums[mid+1] != target){
return mid;
}
else{
left=mid+1;
}
}
}
return -1;
}
};