总结:数组为有序数组,同时题目还强调数组中无重复元素,都可以考虑用二分搜索
Leetcode 34 在排序数组中查找元素的第一个和最后一个位置
/**
* @param {number[]} number
* @param {number} target
* @return {number[]}
*/
const binarySearch = (nums, target, lower) => {
let left = 0, right = nums.length - 1, ans = nums.length;
while (left <= right) {
const mid = Math.floor((left + right) / 2);
if (nums[mid] > target || (lower && nums[mid] >= target)) {
right = mid - 1;
ans = mid;
} else {
left = mid + 1;
}
}
return ans;
}
var searchRange = function(nums, target) {
let ans = [-1, -1];
const leftIdx = binarySearch(nums, target, true);
const rightIdx = binarySearch(nums, target, false) - 1;
if (leftIdx <= rightIdx && rightIdx < nums.length && nums[leftIdx] === target && nums[rightIdx] === target) {
ans = [leftIdx, rightIdx];
}
return ans;
};
35 搜索插入位置
/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
var searchInsert = function(nums, target) {
let left = 0
let right = nums.length - 1
while(left<=right){
let middle = left+Math.floor((right-left)/2)
if(nums[middle]>target){
right = middle - 1
}else if(nums[middle]<target){
left = middle +1
}else return middle
}
return left
};
69 x 的平方根
/**
* @param {number} x
* @return {number}
*/
var mySqrt = function(x) {
let left=0,right=Math.floor(x/2)+1,ans=0
while(left<=right){
let mid = Math.floor((left+right)/2)
let tmp = mid*mid
if(tmp>x){
right = mid-1
ans = mid
}else if(tmp<x) left= mid+1
else return mid
}
return ans-1
};
367 有效的完全平方数
/**
* @param {number} num
* @return {boolean}
*/
var isPerfectSquare = function(num) {
let left = 0,right = Math.floor(num/2)+1,ans=0
while(left<=right){
let mid = Math.floor((left+right)/2)
ans = mid*mid
if(ans>num) right = mid-1
else if(ans<num) left = mid + 1
else return true
}
return false
};