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
};

本文完,感谢阅读。

相关推荐
子兮曰2 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰2 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
倒头就睡的小比特2 天前
算法竞赛C++常用的STL
c++·算法
小羊没烦恼!2 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
前端小万2 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝2 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
三十而立洋2 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
晨米酱2 天前
AGENTS.md:Agent 的上下文策略层
面试·架构·agent
猎头南楼2 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
卡布鲁2 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js