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

本文完,感谢阅读。

相关推荐
wzfj1234519 小时前
Opaque Pointer / Incomplete Type
c++·算法·c
冰西瓜60019 小时前
贪心(四)——拟阵 算法设计与分析 国科大
算法·贪心算法
阿拉伯柠檬19 小时前
传输层协议TCP(二)
linux·服务器·网络·网络协议·tcp/ip·面试
Franciz小测测19 小时前
Gemini 网页端自定义教程:利用 Stylus 强制开启宽屏显示
前端·css·stylus
彭不懂赶紧问19 小时前
鸿蒙NEXT开发浅进阶到精通15:从零搭建Navigation路由框架
前端·笔记·harmonyos·鸿蒙
xkxnq19 小时前
第一阶段:Vue 基础入门(第 2 天)
前端·javascript·vue.js
程序员刘禹锡19 小时前
定位与图标字体知识点全解析!!!(12.31)
前端·css·html·css3
wordbaby19 小时前
公私分明:为什么你不应该共用 SSH Key(附多账号最佳实践指南)
前端·git·ssh
漫随流水19 小时前
leetcode算法(344.反转字符串)
数据结构·算法·leetcode
多啦C梦a19 小时前
《双Token机制?》Next.js 双 Token 登录与无感刷新实战教程
前端·全栈·next.js