30天刷题挑战(二十)

题目来源: LeetCode 75 30 天 JavaScript 挑战

代码 162. 寻找峰值

思路

二分查找,使用 left, right 两个指针,每次算出 mid, 如果 nums[mid] 大于 nums[mid + 1] 那么峰值在左边,执行 right = mid, 否则峰值在右边, 执行 left = mid + 1, 最后然后 left 指针。

代码

js 复制代码
/**
 * @param {number[]} nums
 * @return {number}
 */
var findPeakElement = function(nums) {
  let left = 0
  let right = nums.length - 1

  while(left < right) {
    const mid = Math.floor(left + (right - left) / 2)
      
    if (nums[mid] > nums[mid + 1]) {
      right = mid
    } else {
      left = mid + 1
    }
  }

  return left
};

875. 爱吃香蕉的珂珂

思路

二分查找,每次判断是否能在时间内吃完 k 个香蕉,能吃完时间加一,不能吃完时间加上Math.ceil(piles[i] / k),最后返回 k 最小的值。

代码

js 复制代码
/**
 * @param {number[]} piles
 * @param {number} h
 * @return {number}
 */
var minEatingSpeed = function(piles, h) {
  let mid
  let left = 1
  let right = Math.max(...piles)

  while(left < right) {
    mid = Math.floor(left + (right - left) / 2)
    // 判断能否在 mid 值吃完香蕉
    if (canEat(mid, h, piles)) {
      right = mid
    } else {
      left = mid + 1
    }
  }

  return left
};

function canEat(k, h, piles) {
  let total = 0

  for (let i = 0; i < piles.length; i++) {
    if (piles[i] <= k) {
      total += 1
    } else {
      total += Math.ceil(piles[i] / k)
    }
  }
  // 返回吃完用时是否大于总时间
  return total <= h
}

17. 电话号码的字母组合

思路

递归回溯,终止条件是当前路径的长度等于 digits 的长度,每次从 digits 取出一个数字开始递归调用,到达终止条件, 先将结果保存到 res 数组,然后开始回溯 path.pop()

代码

js 复制代码
const map = new Map()

map.set(2, 'abc')
map.set(3, 'def')
map.set(4, 'ghi')
map.set(5, 'jkl')
map.set(6, 'mno')
map.set(7, 'pqrs')
map.set(8, 'tuv')
map.set(9, 'wxyz')

/**
 * @param {string} digits
 * @return {string[]}
 */
var letterCombinations = function(digits) {
  if(!digits.length) {
    return []
  }

   let res = []
   let path = []
   
   const recur = (path, start)  => {
     // 到达终止条件
     if (path.length === digits.length) {
       res.push(path.slice(0).join(''))
       return
     }

     const letters = map.get(parseInt(digits[start]))

     for (let i = 0; i < letters.length; i++) {
       path.push(letters[i])
       // 递归
       recur(path, start + 1)
       // 回溯
       path.pop()
     }
   }

   recur(path, 0)

   return res
};

本文完,感谢阅读。

相关推荐
子兮曰17 分钟前
DeepSeek TUI:原生 Rust 打造的终端 AI 编码 Agent
前端·javascript·后端
做cv的小昊29 分钟前
【TJU】研究生应用统计学课程笔记(8)——第四章 线性模型(4.1 一元线性回归分析)
笔记·线性代数·算法·数学建模·回归·线性回归·概率论
DFT计算杂谈30 分钟前
自动化脚本一键绘制三元化合物相图
java·运维·服务器·开发语言·前端·python·自动化
子兮曰33 分钟前
深入 Superpowers:180k Stars 的开源 AI 编程方法论是如何工作的
前端·javascript·后端
沸点小助手1 小时前
「新晋AI顶流PK:GPT-5.5 vs DeepSeek V4&掘友吐槽小会」沸点获奖名单公示|本周互动话题上新🎊
前端·人工智能
隔壁的大叔1 小时前
Markdown 渲染如何穿插自定义组件
前端·javascript·vue.js
贾斯汀玛尔斯1 小时前
每天学一个算法--倒排索引(Inverted Index)
算法·inverted-index
Rik1 小时前
用 AI Skill 封装你的工作流:从代码规范到全流程提效实战
前端·后端
小e说说1 小时前
打破偏科困境:这些学习软件助孩子重燃学习热情
算法
Dabei1 小时前
Android TV 焦点处理详解:遥控器与空鼠
android·前端