1. 问题描述:

给你一个整数数组 beans ,其中每个整数表示一个袋子里装的魔法豆的数目。请你从每个袋子中拿出一些豆子(也可以不拿出),使得剩下的非空袋子中(即至少还有一颗魔法豆的袋子)魔法豆的数目相等 。一旦魔法豆从袋子中取出,你不能将它放到任何其他的袋子中。请你返回你需要拿出魔法豆的最少数目。

示例 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 <= 10 ^ 5
1 <= beans[i] <= 10 ^ 5

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/removing-minimum-number-of-magic-beans/

2. 思路分析:

因为需要使得剩余袋子的豆子数量相等所以只能够将当前其余袋子的豆子的数量与袋子中豆子数量最少的豆子数量相等,基于这个想法我们可以先对beans排序,我们可以枚举将前i个袋子的豆子拿掉,然后使得剩余袋子中豆子的数量相等,i从0~n-1,因为需要将前i个袋子的豆子拿掉所以需要维护beans的前缀和s2,并且需要求解使得剩余袋子的豆子数量相等求解对应的操作次数,我们可以维护前缀和s1,其中s1[i]表示前i个数字变为第一个数字的操作次数,这样每一个元素都是以第一个袋子的豆子为基准,这样后面我们使得第i个位置之后剩余袋子中的豆子数量相等的时候减去剩余袋子数量 * (beans[i + 1] - bean[0]),并且还需要减去前i个位置变为第一个位置豆子数量的操作次数,因为我们是直接拿掉前i个位置的豆子所以这一部分的值需要减掉,所以枚举拿掉前i个袋子的豆子使得剩余袋子中豆子数量相等操作次数为:s2[i+1] + s1[n-1] - s1[i] - (n-i-1)*(beans[i+1]-beans[0]),并且还需要特判一下特殊情况:将所有元素变为第一个元素的操作次数,所有情况取一个min就是答案。

3. 代码如下:

go:

package mainimport ("fmt""sort"
)// 求解两个int数字的最小值
func getMin(a, b int) int {if a < b {return a}return b
}func minimumRemoval(beans []int) int64 {sort.Ints(beans)n := len(beans)// 声明切片s1, s2这样不用声明数组那样需要固定长度, 其中s1[i]表示将0~i的数字变为第一个数字操作次数, s2[i]表示0~i-1的beans的前缀和s1, s2 := make([]int, n+10), make([]int, n+10)x := 0for i := 1; i < n; i++ {x += beans[i] - beans[i-1]s1[i] += s1[i-1] + xs2[i] += s2[i-1] + beans[i-1]}s2[n] += s2[n-1] + beans[n-1]// 特殊情况res := s2[n]-beans[0]*nfor i := 0; i < n-1; i++ {// 枚举将前i个数字拿掉, 其余数字变为相等, 因为要变为相等肯定是将其余数字变为第i + 1个数字, 使用公式结合之前维护的s1, s2的值计算出其余数字变为bean[i + 1]的操作次数, 所有情况取一个min就是答案t := s2[i+1] + s1[n-1] - s1[i] - (n-i-1)*(beans[i+1]-beans[0])res = getMin(res, t)}return int64(res)
}

python:

from typing import Listclass Solution:def minimumRemoval(self, beans: List[int]) -> int:n = len(beans)beans.sort()s1, s2 = [0], [0]x = 0for i in range(1, n):x += beans[i] - beans[i - 1]s1.append(s1[i - 1] + x)s2.append(s2[-1] + beans[i - 1])# 计算最后一个位置的前缀和s2.append(s2[-1] + beans[-1])res = s2[-1] - beans[0] * nfor i in range(n - 1):res = min(res, s2[i + 1] - s1[i] + s1[n - 1] - (n - i - 1) * (beans[i + 1] - beans[0]))return res

2171 拿出最少数目的魔法豆(枚举 + 前缀和)相关推荐

  1. LeetCode 2171. 拿出最少数目的魔法豆

    文章目录 一.题目 1.题目描述 2.基础框架 3.原题链接 二.解题报告 1.思路分析 2.时间复杂度 3.代码详解 三.本题小知识 四.加群须知 一.题目 1.题目描述   给你一个正整数数组 b ...

  2. LeetCode 2171. 拿出最少数目的魔法豆(排序)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个 正 整数数组 beans ,其中每个整数表示一个袋子里装的魔法豆的数目. 请你从每个袋子中 拿出 一些豆子(也可以 不拿出),使得剩下的 非空 ...

  3. LeetCode 1689. 十-二进制数的最少数目(脑筋急转弯)

    文章目录 1. 题目 2. 解题 1. 题目 如果一个十进制数字不含任何前导零,且每一位上的数字不是 0 就是 1 ,那么该数字就是一个 十-二进制数 . 例如,101 和 1100 都是 十-二进制 ...

  4. LeetCode 1481. 不同整数的最少数目(计数+排序+贪心)

    1. 题目 给你一个整数数组 arr 和一个整数 k .现需要从数组中恰好移除 k 个元素,请找出移除后数组中不同整数的最少数目. 示例 1: 输入:arr = [5,5,4], k = 1 输出:1 ...

  5. Python贪吃蛇双人大战-魔法豆登场

    Python贪吃蛇双人大战-魔法豆登场 时隔两月之后,家里的小朋友再次对我之前改写的贪吃蛇游戏(过程可参考我之前写的 Python贪吃蛇双人大战 和 Python贪吃蛇双人大战-升级版,代码可以到此处 ...

  6. Leetcode1689. 十-二进制数的最少数目[C++题解]:贪心、找规律简单题

    文章目录 题目 题目链接 题目 想法:初始想法是遍历这些十-二进制数,看哪些和等于n. 发现行不通. 其实可以从11111这样的数构造.对于n的每一位,只要不为0就令该位为1. 比如 320 -110 ...

  7. 十-二进制数的最少数目

    十-二进制数的最少数目 如果一个十进制数字不含任何前导零,且每一位上的数字不是 0 就是 1 ,那么该数字就是一个 十-二进制数 .例如,101 和 1100 都是 十-二进制数,而 112 和 30 ...

  8. 关于在大长方形内放小长方形的最少数目问题

    关于在大长方形内放小长方形的最少数目问题. 题意简述: 有一个

  9. 文本合成图像栩栩如生,仿佛拥有人类的语言想象力:OpenAI祭出120亿参数魔法模型!...

    点击上方"机器学习与生成对抗网络",关注"星标" 获取有趣.好玩的前沿干货! 作者 | OpenAI 来源 | AI科技评论 编译 | 贝爽.陈大鑫 前几个月G ...

最新文章

  1. jackson 反序列化string_java – 使用Jackson对数组进行反序列化
  2. 你在用什么思想编码:事务脚本 OR 面向对象?
  3. Ubuntu14.04安装Octave
  4. pip更新失败_最全Tensorflow2.0 入门教程持续更新
  5. 中国移动将向广大开发者开放了SDK/API等开发工具
  6. 太肝了、最近5年183个Java面试问题列表及回答(值得收藏)
  7. vue 类型字段除了用select框_pumelo-select
  8. YII 1.0 隐藏单入口index.php 设置路由与伪静态
  9. 利用清华镜像、阿里云镜像与豆瓣镜像pip资源
  10. IATF16949:2016汽车质量管理体系认证办理流程
  11. 各种工业以太网技术浅析
  12. 微服务实战之高可用性
  13. 一般java培训课程有哪些?
  14. 尚硅谷nodejs入门教程_笔记
  15. This Python interpreter is in a conda environment, but the environment hasnot been activated. 如何解决?
  16. ADF4350调试笔记
  17. ios 图片加载内存尺寸_iOS内存分析上-图片加载内存分析
  18. 云豹短视频app源码中关于php--thinkcmf配置语言包的说明
  19. ICMP类型报文分类。
  20. kaggle Talking Data 广告欺诈检测竞赛 top 1%方案分享

热门文章

  1. 大数据量的兴趣点如何在Cesium快速加载?(weixin公众号【图说GIS】)
  2. [MindManager]“R6025 - pure virtual function call”解决办法
  3. 在endnote中添加中文参考文献格式
  4. C++OpencvPCB板子引脚缺陷检测
  5. 淘宝api接口一键式获得商品详情详细教程,接口聚全
  6. 软件项目管理第4版课后习题[附解析]第二章
  7. 网易云信流媒体首席架构师:新一代音视频技术架构如何构建?
  8. Execution failed for task ‘:app:javaPreCompileDebug‘.
  9. 读书摘抄3:德伯家的苔丝
  10. MySQL——事务管理