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

本文完,感谢阅读🌹

相关推荐
liulilittle5 分钟前
C++ 浮点数封装。
linux·服务器·开发语言·前端·网络·数据库·c++
云雾J视界7 分钟前
当算法试图解决一切:技术解决方案主义的诱惑与陷阱
算法·google·bert·transformer·attention·算法治理
Xの哲學8 分钟前
Linux Miscdevice深度剖析:从原理到实战的完整指南
linux·服务器·算法·架构·边缘计算
无责任此方_修行中12 分钟前
亲历外企裁员:上午还在写代码,下午工位就空了
面试·程序员·求职
wordbaby16 分钟前
Expo 进阶指南:赋予 TanStack Query “原生感知力” —— 深度解析 AppState 与 NetInfo
前端·react native
Moment23 分钟前
从美团全栈化看 AI 冲击:前端转全栈,是自救还是必然 🤔🤔🤔
前端·后端·面试
天问一30 分钟前
使用 Vue Router 进行路由定制和调用的示例
前端·javascript·vue.js
夏乌_Wx43 分钟前
练题100天——DAY23:存在重复元素Ⅰ Ⅱ+两数之和
数据结构·算法·leetcode
立志成为大牛的小牛1 小时前
数据结构——五十六、排序的基本概念(王道408)
开发语言·数据结构·程序人生·算法
老王熬夜敲代码1 小时前
C++中的atomic
开发语言·c++·笔记·面试