LeetCode 1049:最后一块石头的重量 II —— 题解 ✅

LeetCode 1049:最后一块石头的重量 II ------ 题解 ✅

🔗 题目链接

👉 https://leetcode.cn/problems/last-stone-weight-ii/


📖 内容概要

有一堆石头,每块石头的重量为 stones[i]

每次任选两块石头 xy,将它们一起粉碎,剩余重量为 |x - y|

求最后剩下石头的 最小可能重量

✅ 0/1 背包

✅ 分割等和子集的变形

✅ 面试高频 / medium思维题


💡 解题思路(核心)

一、关键转化(非常重要)

最终剩余重量最小 ⇔ 把石头分成两堆,使两堆总重量尽可能接近

因为:

复制代码
最终重量 = |sumA - sumB|

sumA ≈ sumB 时,结果最小。


二、问题等价于

从数组中选取若干石头,使其总和不超过 sum / 2,且尽可能大

👉 典型的 0/1 背包问题


三、DP 定义

java 复制代码
dp[j] = 容量为 j 的背包,能装的最大重量

目标:

java 复制代码
max(dp[target])

四、状态转移方程

java 复制代码
dp[j] = max(
    dp[j],
    dp[j - stones[i]] + stones[i]
)

✅ 每个石头只能用一次

✅ 必须 倒序遍历


五、最终答案

java 复制代码
sum - dp[target] - dp[target]
= sum - 2 × dp[target]

✅ AC 代码(Java)

java 复制代码
class Solution {
    public int lastStoneWeightII(int[] stones) {
        int sum = 0;
        for (int x : stones) {
            sum += x;
        }

        int target = sum / 2;
        int[] dp = new int[1505];

        // 0/1 背包
        for (int i = 0; i < stones.length; i++) {
            for (int j = target; j >= stones[i]; j--) {
                dp[j] = Math.max(
                    dp[j],
                    dp[j - stones[i]] + stones[i]
                );
            }
        }

        return sum - dp[target] - dp[target];
    }
}

⏱️ 复杂度分析

指标 复杂度
时间复杂度 O(n × sum)
空间复杂度 O(sum)

🔍 与「分割等和子集」的关系

题目 目标
416. 分割等和子集 是否存在 sum/2
1049. 最后一块石头 II 最接近 sum/2 的最大值

✅ 本题是 416 题的"最值版"


✅ 一句话总结

把石头分成两堆,使重量差最小,等价于在 sum/2 的限制下做 0/1 背包。

相关推荐
find1star4 小时前
LeetCode 141:环形链表
java·算法·leetcode·链表
迅翼SwiftWing4 小时前
编队系列(总)|固定翼编队如何实现稳定飞行?通信架构、协同算法与工程约束深度解析
算法·架构
LB21125 小时前
力扣160 21 86
算法·leetcode·职场和发展
小智老师PMP6 小时前
2026深度解析|PMP第八版与NPDP核心侧重点本质区别(管理类证书怎么选)
开发语言·分布式·算法·职场和发展·产品经理
HugoStudio_SWAN6 小时前
洛谷 B4450 / B3867 / B3923 智慧购物、储蓄与做题——从程序到生活
c++·学习·程序人生·算法·生活
a187927218316 小时前
【算法】动态规划第二篇:双序列 DP 三课——继承、计步与断链
算法·leetcode·动态规划·dp·回溯·暴力·算法讲解
江畔柳前堤7 小时前
前台·中台·后台:2026年AI原生时代的架构全景图
开发语言·人工智能·算法·机器学习·架构·scala·ai-native
职场的momo7 小时前
字节生活服务海量内推,挑战亿级订单与AI交易中台
人工智能·程序人生·面试·职场和发展·跳槽·生活·业界资讯
文心快码BaiduComate7 小时前
2026 OPC x AI Coding 趋势案例交流会圆满落幕:一个人就一支研发团队
算法
ACM-moran8 小时前
条件显化(二分单峰函数+构造数列)
算法·推公式·整数三分