/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/// 思路// 新建一个search函数,参数为是否查找第一个, true第一个 false 最后一个// 普通二分左闭右开查找// 当等于target时, 查找第一个,right继续前移, 查找最后一个 left继续后移,不移动会死循环
var searchRange =function(nums, target){
let firstIndex =-1;
let lastIndex =-1;seach(true);seach(false);
console.log([firstIndex, lastIndex]);functionseach(isFindFirst){
let left =0;
let right = nums.length;while(left < right){
let mid = Math.floor((left + right)/2);if(nums[mid]=== target){if(isFindFirst){
firstIndex = mid;
right = mid;}else{
lastIndex = mid;
left = mid +1;}}elseif(nums[mid]> target){
right = mid;}else{
left = mid +1;}}}};searchRange([5,7,7,8,8,10],8);// 输入:nums = [5,7,7,8,8,10], target = 8// 输出:[3,4]
35.搜索插入
/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/// 左闭右开 套路 left<right right = mid left = mid+1// 如果没有找到在最后一个right的位置上+1, 不是左+1
var searchInsert =function(nums, target){
let left =0;
let right = nums.length;
let ans =-1;while(left < right){
let mid = Math.floor((left + right)/2);if(nums[mid]> target){
right = mid;}elseif(nums[mid]=== target){
ans = mid;break;}else{
left = mid +1;}}
ans = ans ===-1? right : ans;// console.log(ans);// console.log(left);return ans;};searchInsert([1,3,5,6],5);searchInsert([1,3,5,6],2);// 输入: nums = [1,3,5,6], target = 5// 输出: 2// 输入: nums = [1,3,5,6], target = 2// 输出: 1
69.x的平方根
/**
* @param {number} x
* @return {number}
*/// 思路// 使用二分获取到数的一半 来相乘,来区分条件// while left<=right// 二分指针更改条件 是小于等于x left+=1 ans=mid 大于x right=mid-1
var mySqrt =function(x){
let left =0;
let right = x;
let ans =-1;while(left <= right){
let mid = Math.floor((left + right)/2);if(mid * mid <= x){
ans = mid;
left +=1;}else{
right = mid -1;}}// console.log(ans);return ans;};mySqrt(4);mySqrt(8);
875.爱吃香蕉的珂珂
/**
* @param {number[]} piles
* @param {number} h
* @return {number}
*/// 左闭右开
var minEatingSpeed =(piles, h)=>{
let left =0;
let right = Math.max(...piles)+1;while(left <= right){
let mid = Math.floor((left + right)/2);if(check(mid)<= h){
right = mid;}else{
left = mid +1;}}
console.log(left);return left;functioncheck(speed){return piles.reduce((x, y)=> x + Math.ceil(y / speed),0);}};getSum([3,6,7,11],8);getSum([30,11,23,4,20],5);// 输入:piles = [3,6,7,11], h = 8// 输出:4
121.寻找目标值 - 二维数组
/**
* @param {number[][]} plants
* @param {number} target
* @return {boolean}
*/// 思路 二分// 每行遍历 进行二分查找
var findTargetIn2DPlants =function(plants, target){for(let plan of plants){
let left =0;
let right = plan.length;while(left < right){
let mid = Math.floor((left + right)/2);if(plan[mid]=== target){returntrue;}elseif(plan[mid]> target){
right = mid;}else{
left = mid +1;}}}returnfalse;};
console.log(findTargetIn2DPlants([[2,3,6,8],[4,5,8,9],[5,9,10,12],],8));