Leetcode 1049:最后一块石头的重量 II(超详细的解法!!!)
有一堆石头,每块石头的重量都是正整数。
每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 x
和 y
,且 x <= y
。那么粉碎的可能结果如下:
- 如果
x == y
,那么两块石头都会被完全粉碎; - 如果
x != y
,那么重量为x
的石头将会完全粉碎,而重量为y
的石头新重量为y-x
。
最后,最多只会剩下一块石头。返回此石头最小的可能重量。如果没有石头剩下,就返回 0
。
示例:
输入:[2,7,4,1,8,1]
输出:1
解释:
组合 2 和 4,得到 2,所以数组转化为 [2,7,1,8,1],
组合 7 和 8,得到 1,所以数组转化为 [2,1,1,1],
组合 2 和 1,得到 1,所以数组转化为 [1,1,1],
组合 1 和 1,得到 0,所以数组转化为 [1],这就是最优值。
提示:
1 <= stones.length <= 30
1 <= stones[i] <= 1000
解题思路
首先分析什么时候出现最小重量?如果将数组拆分为两个子数组,那么这两个子数组的差应该就是最后的返回值。也就是我们要将数组拆分为两个子数组,并且两个子数组和的差应该最小。
实际上这是一个01
背包问题。对于每个石头两种情况,选或者不选,而背包的容量就是所有石头重量 W a l l W_{all} Wall的一半 W h a l f W_{half} Whalf,通过计算得到的就是最接近装满背包的重量 W t W_{t} Wt,最后的结果就是 W a l l − 2 ∗ W t W_{all}-2*W_t Wall−2∗Wt。
class Solution:def lastStoneWeightII(self, stones: List[int]) -> int:all_sum = sum(stones)mem = [0]*(all_sum//2+1)mem[0] = 1for i in stones:for j in range(all_sum//2, i-1, -1):mem[j] |= mem[j - i]for i in range(all_sum//2, -1, -1):if mem[i]:return all_sum - 2*ireturn 0
我将该问题的其他语言版本添加到了我的GitHub Leetcode
如有问题,希望大家指出!!!
Leetcode 1049:最后一块石头的重量 II(超详细的解法!!!)相关推荐
- LeetCode 1049. 最后一块石头的重量 II
1049. 最后一块石头的重量 II 无论按照何种顺序粉碎石头,最后一块石头的重量总是可以表示成 可以这样理解,将所有的石头分为两堆,ki=1的石头是一堆,ki=-1的石头是另一堆,我们的目标就是求上 ...
- 153、【动态规划】leetcode ——1049. 最后一块石头的重量 II:滚动数组(C++版本)
题目描述 原题链接:1049. 最后一块石头的重量 II 解题思路 本题要找的是最小重量,我们可以将石头划分成两个集合,当两个集合的重量越接近时,相减后,可达到的装量就会是最小,此时本题的思路其实就类 ...
- 代码随想录刷题|LeetCode 1049. 最后一块石头的重量II 494. 目标和 474.一和零
目录 1049. 最后一块石头的重量 II 思路 最后一块石头的重量|| 494. 目标和 思路 0.求什么 1.确定dp数组的含义 2.递推公式 3.初始化dp数组 4.遍历顺序 目标和 474.一 ...
- LeetCode 1049. 最后一块石头的重量 II(DP)
1. 题目 有一堆石头,每块石头的重量都是正整数. 每一回合,从中选出任意两块石头,然后将它们一起粉碎. 假设石头的重量分别为 x 和 y,且 x <= y.那么粉碎的可能结果如下: 如果 x ...
- 2022-2-19 Leetcode 1049.最后一块石头的重量II
例二分析:26+21-40 = 7 33-31 = 2 7-2 = 5 相当于小块石头集合之后一起去砸大石头. 这道题和最后一块石头的重量I 有什么不同? 例子更复杂了.(虽然不知道复杂在哪里) 这道 ...
- LeetCode 1049. 最后一块石头的重量 II 做题小结
题目 有一堆石头,每块石头的重量都是正整数.每一回合,从中选出任意两块石头,然后将它们一起粉碎.假设石头的重量分别为 x 和 y,且 x <= y.那么粉碎的可能结果如下:如果 x == y,那 ...
- 95. Leetcode 1049. 最后一块石头的重量 II (动态规划-背包问题)
步骤一.确定状态: 确定dp数组及含义 dp[i]表示的是: 背包的容量为i的情况下,所能得到物品的最大值 这里的物品容量和物品价值都是石头的重量 步骤二.推断状态方程: dp[j] = max(dp ...
- leetcode - 1049. 最后一块石头的重量 II
这个问题可以转化为0-1背包问题,背包的大小为所有石头的重量之和的一半,意思就是找到要求的石头组合重量之和最接近所有石头重量的一半.具体的C++代码如下: class Solution { publi ...
- LeetCode:1049.最后一块石头的重量II 494.目标和 474.一和零
1049.最后一块石头的重量II 题目 有一堆石头,用整数数组 stones 表示.其中 stones[i] 表示第 i 块石头的重量. 每一回合,从中选出任意两块石头,然后将它们一起粉碎.假设石头的 ...
- LeetCode刷题day43|1049. 最后一块石头的重量 II、 494. 目标和、474.一和零
文章目录 一.1049. 最后一块石头的重量 II 二.494. 目标和 三.474.一和零 一.1049. 最后一块石头的重量 II 这道题其实就与"分割子集"一样,就是先将总和 ...
最新文章
- 如何在asp.net中动态生成验证码
- IPFS中国社区丨最简单全面介绍IPFS
- Mysql8.0 15安装后怎么打开_mysql-8.0.15-winx64 解压版安装 图文详解
- java中sql查找_Java 中如何使用 SQL 查询文本
- 太极图正确画法_什么是太极?其意义是什么?太极图是谁画的?
- Kubernetes 编排系统
- 3dmax报错信息大全,最全解决方案来了
- 2022年iOS面试题简答题
- 三门峡市新型智慧城市顶层设计方案通过专家评审
- 大数据平台及挖掘调研
- 【长难句分析精讲】状语从句
- 上亿会员 为b站会员购众筹项目打下消费基础
- 可靠传输的实现机制——回退N帧协议GBN(Go Back N)
- 你的新媒体写作工具横向测评,请查收!
- 基于VC++6.0开发俄罗斯方块(五)
- 8个 Chatbot 框架介绍
- 去哪儿2018春季校园招聘软件开发工程师笔试经验
- 开发自己的编程语言(五)—— CIL中间代码的生成
- Android项目实战——菜鸟商城
- Go 每日一库之 email
热门文章
- php学习第一天之HTML篇
- docker拉取mysql镜像太慢的问题
- Jenkins构建项目的时候出现构建不稳定异常UNSTABLE
- [图论]分层图最短路
- 北京无人驾驶_无需预约!在北京的朋友可以一键呼叫“无人驾驶”出租车了
- [oracle问题] 创建表时弹出ORA-00942错误
- ElasticSearch 6.x 学习笔记:20.搜索排序
- drawstring 文本居中,如何在Java中居中drawString?
- htaccess 域名 linux,教你使用.htaccess文件实现指定域名访问指定二级目录
- MFC EnterCriticalSection 卡死问题