拿出最少数目的魔法豆

简介: 拿出最少数目的魔法豆

说在前面

🎈不知道大家对于算法的学习是一个怎样的心态呢?为了面试还是因为兴趣?不管是出于什么原因,算法学习需要持续保持。

题目描述

请你从每个袋子中 拿出 一些豆子(也可以 不拿出),使得剩下的 非空 袋子中(即 至少还有一颗 魔法豆的袋子)魔法豆的数目 相等。一旦把魔法豆从袋子中取出,你不能再将它放到任何袋子中。

请返回你需要拿出魔法豆的 最少数目。

示例 1:

输入:beans = [4,1,6,5]
输出:4
解释:
- 我们从有 1 个魔法豆的袋子中拿出 1 颗魔法豆。
  剩下袋子中魔法豆的数目为:[4,0,6,5]
- 然后我们从有 6 个魔法豆的袋子中拿出 2 个魔法豆。
  剩下袋子中魔法豆的数目为:[4,0,4,5]
- 然后我们从有 5 个魔法豆的袋子中拿出 1 个魔法豆。
  剩下袋子中魔法豆的数目为:[4,0,4,4]
总共拿出了 1 + 2 + 1 = 4 个魔法豆,剩下非空袋子中魔法豆的数目相等。
没有比取出 4 个魔法豆更少的方案。

示例 2:

输入:beans = [2,10,3,2]
输出:7
解释:
- 我们从有 2 个魔法豆的其中一个袋子中拿出 2 个魔法豆。
  剩下袋子中魔法豆的数目为:[0,10,3,2]
- 然后我们从另一个有 2 个魔法豆的袋子中拿出 2 个魔法豆。
  剩下袋子中魔法豆的数目为:[0,10,3,0]
- 然后我们从有 3 个魔法豆的袋子中拿出 3 个魔法豆。
  剩下袋子中魔法豆的数目为:[0,10,0,0]
总共拿出了 2 + 2 + 3 = 7 个魔法豆,剩下非空袋子中魔法豆的数目相等。
没有比取出 7 个魔法豆更少的方案。

提示:

  • 1 <= beans.length <= 105
  • 1 <= beans[i] <= 105

解题思路

这道题我们比较容易看出其实就是一道前缀和的题目,我们可以分为以下几步来进行解题,这里我们以示例一为例子来详说解题步骤:

对数组进行排序

我们可以先对数组进行排序

beans.sort((a, b) => b - a);

排序后的数组如下:

计算每个下标前面的元素置为当前元素值所需要减去的总和

[6] => [6] = 6 - 6 = 0
[6,5] => [5,5] = (6 - 5) + (5 - 5) = 1
[6,5,4] => [4,4,4] = (6 - 4) + (5 - 4) + (4 - 4) = 3
[6,5,4,1] => [1,1,1,1] = (6 - 1) + (5 - 1) + (4 - 1) + (1 - 1) = 12

从后往前计算前缀和

遍历每种取法,找出最小的取法

从上图我们可以看出前三项置为4,最后一下置为0是最优的取法。

AC代码

/**
 * @param {number[]} beans
 * @return {number}
 */
var minimumRemoval = function (beans) {
  beans.sort((a, b) => b - a);
  const cnt = new Array(beans.length).fill(0);
  for (let i = 1; i < beans.length; i++) {
    cnt[i] = (beans[i - 1] - beans[i]) * i + cnt[i - 1];
  }
  let min = cnt[cnt.length - 1];
  let sum = 0;
  for (let i = beans.length - 1; i > 0; i--) {
    sum += beans[i];
    min = Math.min(sum + cnt[i - 1], min);
  }
  return min;
};

公众号

关注公众号『前端也能这么有趣』,获取更多有趣内容。

说在后面

🎉 这里是 JYeontu,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打羽毛球 🏸 ,平时也喜欢写些东西,既为自己记录 📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解 🙇,写错的地方望指出,定会认真改进 😊,偶尔也会在自己的公众号『前端也能这么有趣』发一些比较有趣的文章,有兴趣的也可以关注下。在此谢谢大家的支持,我们下文再见 🙌。

目录
相关文章
|
11月前
优化是一种习惯●出发点是"站在靠近临界"的地方
优化是一种习惯●出发点是"站在靠近临界"的地方
43 0
|
5月前
|
开发者
当做的游戏没人玩时,还要不要继续做下去了
当做的游戏没人玩时,还要不要继续做下去了
35 0
招聘时要注意的十个危险信号
招聘时要注意的十个危险信号
|
算法 搜索推荐 程序员
再也不担心用不好二分法了,因为我找到了"作弊"的接口
导读:算法是程序的灵魂,而复杂度则是算法的核心指标之一。为了降低复杂度量级,可谓是令无数程序员绞尽脑汁、甚至是摧枯秀发。一般而言,若能实现对数阶的时间复杂度,算法效率往往就已经非常理想。而实现对数阶的常用思想莫过于二分。 二分常有,好用的二分并不常有。while条件是lo<hi还是lo<=hi?分支判断mid是+1还是-1还是仍然取值mid?最后return哪个值?如果目标序列不是严格递增又该怎么处理?想想都不禁让人敬而远之。幸运的是,在python语言中,已经内置了成熟的二分函数。
132 0
再也不担心用不好二分法了,因为我找到了"作弊"的接口
|
架构师 Java Spring
追逐影子的人,最终只会是影子
追逐影子的人,最终只会是影子
139 0
追逐影子的人,最终只会是影子
|
存储 人工智能 运维
【超干货!面试问答】12种提升用例执行速度办法 - 真实面试问题标准答案
【超干货!面试问答】12种提升用例执行速度办法 - 真实面试问题标准答案
|
移动开发 JavaScript 前端开发
Day 5: GruntJS——重复乏味的工作总会有人做(反正我不做)
我们发现了比较有趣的系列文章《30天学习30种新技术》,准备翻译,一天一篇更新,年终礼包。下面是第五天的内容。
228 0
Day 5: GruntJS——重复乏味的工作总会有人做(反正我不做)
|
安全 PHP
PHP编程模拟病毒传播过程,告诉你为什么不能随意出门溜达?
由于近期新冠状肺炎病毒的传播,我们看到上图中的病毒传播过程介绍。同时,为了让这个过程更加的直观,我们用计算机编程模拟了一个简单的模型来演示,通过视觉效果给大家做个演示!
436 0
PHP编程模拟病毒传播过程,告诉你为什么不能随意出门溜达?