1049. 最后一块石头的重量 II

Problem: 1049. 最后一块石头的重量 II

思路

为了得到最后一块石头的最小可能重量,我们可以将问题转为子集和的问题。找到一个子集,使得元素之和与剩余元素之后的差最小。也就是说,我们希望把石头分成两个集合,使得两个子集的重量差最小。由于我们可以通过将一个子集的重量从总重量中减去来得到另一个子集的重量,因此,我们的目标可以简化为寻找一个子集,其元素之和最接近总重量的一半。这样,两个子集之间的重量差就会是最小的。

解题方法

我们使用动态规划解决这个问题。定义一个一维数组 dp,其中 dp[j] 表示是否能够通过选择一些石头(不超过 j)达到总和 j。我们初始化 dp[0] 为 true,因为总和为 0 是总是可以实现的。
遍历数组 nums 中的每个元素 num,对于每一个 num,我们更新 dp 数组,使得 dp[j] 变为 dp[j-num]+num 和 dp[j] 中较大的值,只要 j >= num。
最后,dp 数组中的最大值就是我们要求的子集的近似最大重量。

复杂度

时间复杂度:

O ( n ⋅ m ) O(n⋅m) O(nm),其中 n 是数组 nums 的长度,m 是 nums 中所有元素的和除以 2 的结果。

空间复杂度:

O ( m ) O(m) O(m),其中 m 是 nums 中所有元素的和除以 2 的结果。这是因为我们需要一个大小为 m+1 的 dp 数组。

Code

class Solution {
    public int lastStoneWeightII(int[] nums) {
        int sum = 0;
        for (int num : nums) {
            sum += num;
        }
        // 向下取整 01背包
        int near = near(nums, sum / 2);
        return sum - near - near;
    }
    public int near(int[] nums, int t) {
        int[] dp = new int[t + 1];
        for(int num : nums) {
            for(int j = t; j >= num; j--) {
                dp[j] = Math.max(dp[j], dp[j - num] + num);
            }
        }
        return dp[t];
    }
}

相关推荐

  1. LeetCode 1049. 最后石头重量 II

    2024-06-11 15:50:04       32 阅读
  2. 1049. 最后石头重量 II

    2024-06-11 15:50:04       35 阅读
  3. 1049. 最后石头重量 II(力扣LeetCode)

    2024-06-11 15:50:04       42 阅读
  4. Leetcode 1046. 最后石头重量

    2024-06-11 15:50:04       41 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-11 15:50:04       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-11 15:50:04       106 阅读
  3. 在Django里面运行非项目文件

    2024-06-11 15:50:04       87 阅读
  4. Python语言-面向对象

    2024-06-11 15:50:04       96 阅读

热门阅读

  1. Web前端浪漫源码:编织梦想与爱的交织乐章

    2024-06-11 15:50:04       31 阅读
  2. 重新学习STM32(1)GPIO

    2024-06-11 15:50:04       26 阅读
  3. 将字符串转换为Python数据类型

    2024-06-11 15:50:04       31 阅读
  4. 代码随想录——数组

    2024-06-11 15:50:04       33 阅读
  5. CVE-2024-1086漏洞处理

    2024-06-11 15:50:04       31 阅读
  6. ArrayList源码解析

    2024-06-11 15:50:04       28 阅读
  7. USB (5)

    USB (5)

    2024-06-11 15:50:04      29 阅读
  8. Python 日期和时间

    2024-06-11 15:50:04       32 阅读
  9. API接口:解锁社交电商的创新潜力

    2024-06-11 15:50:04       41 阅读
  10. 【Anaconda】 anaconda常用命令总结

    2024-06-11 15:50:04       32 阅读
  11. 分治思想 +各种数据结构(线段树,归并排血)

    2024-06-11 15:50:04       26 阅读