跳到主要内容

题目

一、求 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)。我们只需要常数空间存放若干变量。