题目
一、求 X 的平方根
在不使用 Math.sqrt(x)
函数的情况下,得到 X
的平方根的整数部分
function binarySqrt(x){
let left=1;
let right=x;
let middle=Math.floor((left+right)/2);
while(left<=right){
let temp=middle*middle;
let temps=(middle+1)*(middle+1)
if(temps<x){
left=middle+1;
}else if(temp>x){
right=middle-1;
}else if(x==temps){
return middle+1
}else{
return middle
}
middle=Math.floor((left+right)/2);
}
}
console.log(binarySqrt(11));
二、查找插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n)
的算法。
示例:
输入: nums = [1,3,5,6], target = 5
输出: 2
示例:
输入: nums = [1,3,5,6], target = 2
输出: 1
思路: 二分查找位置算法
实现
function binarySearch(left, right, target, array){
let l = left;
let r= right;
while(l < r){
const middle = (l + r) >> 1;
const middleItem = array[middle];
if(middleItem < target){
l = middle + 1;
}else{
r = middle;
}
}
return l;
}
测试
const nums=[1,3,5,6];
const target=5;
console.log(binarySearch(0, nums.length, target, nums));
性能分析:
时间复杂度:O(logn)
,其中 n
为数组的长度。二分查找所需的时间复杂度为 O(logn)
。
空间复杂度:O(1)
。我们只需要常数空间存放若干变量。