分割等和子集 - LeetCode 热题 89

2024-06-10 10:04
文章标签 leetcode 分割 热题 子集 89

本文主要是介绍分割等和子集 - LeetCode 热题 89,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

大家好!我是曾续缘💚

今天是《LeetCode 热题 100》系列

发车第 89 天

动态规划第 9 题

❤️点赞 👍 收藏 ⭐再看,养成习惯

分割等和子集

给你一个 只包含正整数 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。

 

示例 1:

输入:nums = [1,5,11,5]
输出:true
解释:数组可以分割成 [1, 5, 5] 和 [11] 。

示例 2:

输入:nums = [1,2,3,5]
输出:false
解释:数组不能分割成两个元素和相等的子集。

 

提示:

  • 1 <= nums.length <= 200
  • 1 <= nums[i] <= 100
难度:💖💖

解题方法

这道题要求判断给定的正整数数组是否可以被分割成两个子集,使得两个子集的元素和相等。

  1. 求和与最大值: 首先遍历整个数组,计算数组元素的总和sum和数组中的最大值mx

  2. 特殊情况处理:

    • 如果数组长度小于2,直接返回false
    • 如果总和sum为奇数,无法平分,返回false
    • 如果最大值mx大于总和的一半,也无法平分,返回false
  3. 动态规划:

    • 创建一个二维布尔数组f,其中f[i][j]表示前i个元素能否组成和为j的子集。
    • 初始化第一行和第一列,第一行表示只选取第一个元素能否得到和为j,第一列表示不选取任何元素,和为0
    • 遍历数组元素,更新f数组:
      • 可以不选当前元素nums[i],则f[i][j]f[i-1][j]相同
      • 如果当前元素值nums[i]小于j,可以选nums[i]f[i][j]还可以由f[i-1][j-nums[i]]转移来。
  4. 返回结果: 最终返回f[n-1][sum],表示整个数组能否被分割成两个和相等的子集。

Code

class Solution {public boolean canPartition(int[] nums) {int n = nums.length; // 获取数组长度int sum = 0, mx = 0; // 计算数组总和及最大值for(int num : nums){sum += num; // 累加所有元素得到总和mx = Math.max(mx, num); // 更新最大值}if(sum % 2 == 1) return false; // 如果总和是奇数,直接返回falsesum /= 2; // 计算目标和,即总和的一半if(mx > sum) return false; // 如果最大值比目标和还大,不能分割boolean[][] f = new boolean[n][sum + 1]; // 初始化动态规划表for(int i = 0; i < n; i++){f[i][0] = true; // 不选取任何数字就可以得到和为0的情况}f[0][nums[0]] = true; // 第一个数字可以构成和为它自身的子集// 动态规划填表for(int i = 1; i < n; i++){for(int j = 1; j <= sum; j++){f[i][j] = f[i - 1][j]; // 不选取当前数字if(j >= nums[i]){ // 如果当前数字可以被加入子集f[i][j] |= f[i - 1][j - nums[i]]; }}}return f[n - 1][sum]; // 检查最后一个数字的和是否达到目标和}
}

这篇关于分割等和子集 - LeetCode 热题 89的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1047856

相关文章

使用Python将长图片分割为若干张小图片

《使用Python将长图片分割为若干张小图片》这篇文章主要为大家详细介绍了如何使用Python将长图片分割为若干张小图片,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. python需求的任务2. Python代码的实现3. 代码修改的位置4. 运行结果1. Python需求

C#中字符串分割的多种方式

《C#中字符串分割的多种方式》在C#编程语言中,字符串处理是日常开发中不可或缺的一部分,字符串分割是处理文本数据时常用的操作,它允许我们将一个长字符串分解成多个子字符串,本文给大家介绍了C#中字符串分... 目录1. 使用 string.Split2. 使用正则表达式 (Regex.Split)3. 使用

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

leetcode-24Swap Nodes in Pairs

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode swapPairs(L

leetcode-23Merge k Sorted Lists

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode mergeKLists

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

【JavaScript】LeetCode:16-20

文章目录 16 无重复字符的最长字串17 找到字符串中所有字母异位词18 和为K的子数组19 滑动窗口最大值20 最小覆盖字串 16 无重复字符的最长字串 滑动窗口 + 哈希表这里用哈希集合Set()实现。左指针i,右指针j,从头遍历数组,若j指针指向的元素不在set中,则加入该元素,否则更新结果res,删除集合中i指针指向的元素,进入下一轮循环。 /*** @param

SAM2POINT:以zero-shot且快速的方式将任何 3D 视频分割为视频

摘要 我们介绍 SAM2POINT,这是一种采用 Segment Anything Model 2 (SAM 2) 进行零样本和快速 3D 分割的初步探索。 SAM2POINT 将任何 3D 数据解释为一系列多向视频,并利用 SAM 2 进行 3D 空间分割,无需进一步训练或 2D-3D 投影。 我们的框架支持各种提示类型,包括 3D 点、框和掩模,并且可以泛化到不同的场景,例如 3D 对象、室