30天刷题挑战(十九)

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

2462. 雇佣 K 位工人的总代价

思路

使用两个优先队列存放 costs 左右两边的数据,每次判断左右队列头的大小,将小的数出列加到总代价上,一直到雇佣数为 0,返回总代价。

代码

js 复制代码
/**
 * @param {number[]} costs
 * @param {number} k
 * @param {number} candidates
 * @return {number}
 */
var totalCost = function(costs, k, candidates) {
  const left = new MinPriorityQueue();
  const right = new MinPriorityQueue();
  

  let cost = 0
  let i = 0
  let j = costs.length -1

  while (k > 0) {
    while(i <= j && left.size() < candidates) {
      left.enqueue(costs[i++])
    }

    while(i <= j && right.size() < candidates) {
      right.enqueue(costs[j--])
    }

    const min1 = left.size() > 0 ? left.front().element : Infinity
    const min2 = right.size() > 0 ? right.front().element : Infinity
   
    if (min1 <= min2) {
      cost += left.dequeue().element
    } else {
      cost += right.dequeue().element
    }
    k--
  }

  return cost
};

374. 猜数字大小

思路

二分查找,每次寻找目标数在左还是右区间,当 guess(mid) 等于 0 时返回 left

代码

js 复制代码
/** 
 * Forward declaration of guess API.
 * @param {number} num   your guess
 * @return 	     -1 if num is higher than the picked number
 *			      1 if num is lower than the picked number
 *               otherwise return 0
 * var guess = function(num) {}
 */

/**
 * @param {number} n
 * @return {number}
 */
var guessNumber = function(n) {
  let left = 1
  let right = n
  
  while(left  < right) {
    const mid = Math.floor(left + (right - left) / 2)

    if (guess(mid) <= 0) {
      right = mid
    } else {
      left = mid + 1
    }
  }

  return left 
};

2300. 咒语和药水的成功对数

思路

先将 potions 从小到大排序,遍历 spells 数组,每次通过二分查找找到 potions 数组全部强度有效的下标 leftpotions.length - left 表示有效数字的个数,添加到结果中。

代码

js 复制代码
/**
 * @param {number[]} spells
 * @param {number[]} potions
 * @param {number} success
 * @return {number[]}
 */
var successfulPairs = function(spells, potions, success) {
  potions.sort((a, b) => a - b)
  let res = []

  for(let i = 0; i < spells.length; i++) {
    let mid
    let left = 0
    let right = potions.length

    while(left < right) {
      mid = Math.floor(left + (right - left) / 2)
      if (potions[mid] * spells[i] >= success) {
        right = mid
      } else {
        left = mid + 1
      }
    }
    
    res.push(potions.length - left)
  }

  return res
};

本文完,感谢阅读🌹

相关推荐
qq_589666052 小时前
TypeScript 完整入门教程
前端·javascript·typescript
liang_jy2 小时前
内存管理(二)—— 覆盖与交换
面试·操作系统
触底反弹3 小时前
Vibe Coding 不写 Git,等于悬崖边飙车
人工智能·git·面试
liang_jy3 小时前
内存管理(一)—— 内存管理的概念
面试·操作系统
2601_954526753 小时前
【工业传感与算法实战】温漂补偿与零点抗漂破局:基于二阶多项式拟合的 C/C++ 边缘校准算法,深度拆解“压力变送器什么牌子好”的技术硬指标
c语言·c++·算法
叩码以求索5 小时前
浅谈:算法萌新如何高效刷题应对面试(一)
算法·面试·职场和发展
用户059540174465 小时前
LLM对话记忆测试踩坑实录:手工回归30分钟,自动化后2分钟发现3个隐藏Bug
前端·css
c238566 小时前
把 C++ 内存分配拆透:new 与 malloc 的三层血缘
开发语言·c++·算法
Ashley的成长之路7 小时前
前端性能优化实战手册·第2篇:资源加载策略全解
前端·性能优化·资源加载·http/3·性能优化实战·资源加载优化