算法| ss 二分

  • 34.在排序数组中查找元素的第一个和最后一个位置
  • 35.搜索插入
  • 69.x的平方根
  • 875.爱吃香蕉的珂珂

34.在排序数组中查找元素的第一个和最后一个位置

clike 复制代码
/**
 * @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]);
  function seach(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;
        }
      } else if (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.搜索插入

clike 复制代码
/**
 * @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;
    } else if (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的平方根

clike 复制代码
/**
 * @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.爱吃香蕉的珂珂

clike 复制代码
/**
 * @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;
  function check(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
相关推荐
Jinuss1 分钟前
Vue3源码reactivity响应式篇之computed计算属性
前端·vue3
落日沉溺于海1 分钟前
React From表单使用Formik和yup进行校验
开发语言·前端·javascript
知识分享小能手3 分钟前
React学习教程,从入门到精通, React 新创建组件语法知识点及案例代码(11)
前端·javascript·学习·react.js·架构·前端框架·react
会豪6 分钟前
工业仿真(simulation)--前端(五)--标尺,刻度尺
前端
会豪7 分钟前
工业仿真(simulation)--前端(四)--画布编辑(2)
前端
an__ya__9 分钟前
Vue数据响应式reactive
前端·javascript·vue.js
苦逼的搬砖工12 分钟前
Flutter UI Components:闲来无事,设计整理了这几年来使用的UI组件库
前端·flutter
想买Rolex和Supra的凯美瑞车主14 分钟前
Taro + Vite 开发中 fs.allow 配置问题分析与解决
前端
ruanCat15 分钟前
使用 vite 的 base 命令行参数来解决项目部署在 github page 的路径问题
前端·github
Codebee20 分钟前
使用Qoder 改造前端UI/UE升级改造实践:从传统界面到现代化体验的华丽蜕变
前端·人工智能