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

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

🔗 题目链接

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


📖 内容概要

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

每次任选两块石头 x 和 y,将它们一起粉碎,剩余重量为 |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 背包。

相关推荐
海绵宝宝转agent8 小时前
JUC高频面试八股总结个人开源
面试·职场和发展
Nil2089 小时前
leetcode 118杨辉三角
算法·leetcode·职场和发展
wanderist.12 小时前
线性筛法详解:从筛质数到欧拉函数、Möbius 函数与约数函数
java·数据结构·算法
All for pursuit.12 小时前
【设计-1】208.实现Trie (前缀树)
数据结构·c++·算法·leetcode
weixin_3077791312 小时前
C++代码实现MATLAB中的crossval函数功能
开发语言·c++·算法·matlab
青少儿编程课堂12 小时前
背包问题(0/1 背包与完全背包)解题精讲——动态规划入门
c++·python·算法·bfs·信息学竞赛
光影少年13 小时前
为什么 JavaScript 中 0.1 + 0.2 !== 0.3,如何让其相等?
前端·javascript·算法
HEJOO913 小时前
Linux 设备驱动系列——使用全局工作队列
java·linux·算法
Code_Solitude13 小时前
c语言:递归
java·c语言·算法
我命由我1234514 小时前
Photoshop - Photoshop 使用内容识别填充移除对象
学习·职场和发展·产品运营·求职招聘·职场发展·学习方法·photoshop