当前位置: 首页 > news >正文

leetcode热题100.分割等和子集(动态规划)

分割等和子集

Problem: 416. 分割等和子集

思路

我选择使用动态规划的方法来解题。我们需要判断是否可以将数组分割成两个子集,使得这两个子集的和相等。这个问题可以转化为在数组中找到一个子集,使得其和等于数组总和的一半。

解题过程

  1. 首先,我们计算数组的总和 total。如果 total 是奇数,那么我们无法将其分成两个和相等的子集,因此直接返回 False
  2. 接下来,我们将目标和 target 定为 total // 2
  3. 初始化一个二维布尔数组 dp,其中 dp[i][j] 表示前 i 个元素是否可以组成和为 j 的子集。
  4. 设置初始条件:dp[i][0]True,因为和为 0 的子集总是可以通过不选取任何元素来实现。
  5. 遍历数组,更新 dp 数组:
    • 如果当前元素 nums[i] 小于等于目标和 j,则 dp[i][j] 可以由两种情况得到:不包含当前元素(即 dp[i-1][j])或包含当前元素(即 dp[i-1][j-nums[i]])。
    • 如果当前元素 nums[i] 大于目标和 j,则 dp[i][j] 只能由不包含当前元素的情况得到,即 dp[i-1][j]
  6. 最后,检查 dp[n-1][target] 的值,判断是否可以将数组分割成两个和相等的子集。

复杂度

  • 时间复杂度:$O(n \cdot target)$,其中 n 是数组的长度,target 是数组总和的一半。
  • 空间复杂度: $O(n \cdot target)$,因为使用了一个二维数组 dp

Code

from typing import Listclass Solution:def canPartition(self, nums: List[int]) -> bool:n = len(nums)if n < 2:return Falsetotal = sum(nums)if total & 1:return Falsetarget = total // 2if max(nums) > target:return Falsedp = [[False] * (target + 1) for _ in range(n)]for i in range(n):dp[i][0] = Truedp[0][nums[0]] = Truefor i in range(1, n):for j in range(1, target + 1):if j >= nums[i]:dp[i][j] = dp[i-1][j] | dp[i-1][j-nums[i]]else:dp[i][j] = dp[i-1][j]return dp[n-1][target]

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 探索Puppeteer的强大功能:抓取隐藏内容
  • OWASP 移动应用 2024 十大安全风险
  • 为ppt中的文字配色
  • 在 Ubuntu上安装 Docker
  • 详解曼达拉升级:如何用网络拓扑结构扩容BSV区块链
  • vue是如何进行监听数据变化的?vue2和vue3分别是什么?vue3为什么要更换?
  • Rust Result 与可恢复的错误
  • 【内网穿透】如何本地搭建Whisper语音识别模型并配置公网地址
  • 子进程继承父进程文件描述符导致父进程打开设备文件失败
  • C#字符串基本操作
  • 【ARM】SMMU系统虚拟化整理
  • Docker容器化技术(1)
  • python中的re模块--正则表达式
  • 美图WHEE AI:包括文生图、图生图、风格模型训练多种模式图片创作绘画创作平台
  • 查看仓库文件的改变(git-status , git-diff)
  • [NodeJS] 关于Buffer
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • Angular 4.x 动态创建组件
  • es的写入过程
  • Java 23种设计模式 之单例模式 7种实现方式
  • Java深入 - 深入理解Java集合
  • Js基础——数据类型之Null和Undefined
  • magento 货币换算
  • Map集合、散列表、红黑树介绍
  • Material Design
  • PAT A1120
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • vue-loader 源码解析系列之 selector
  • Vue组件定义
  • 从零开始的无人驾驶 1
  • 警报:线上事故之CountDownLatch的威力
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 软件开发学习的5大技巧,你知道吗?
  • 一些css基础学习笔记
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • 阿里云服务器如何修改远程端口?
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • ​埃文科技受邀出席2024 “数据要素×”生态大会​
  • ### RabbitMQ五种工作模式:
  • #java学习笔记(面向对象)----(未完结)
  • $NOIp2018$劝退记
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (php伪随机数生成)[GWCTF 2019]枯燥的抽奖
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (二)十分简易快速 自己训练样本 opencv级联lbp分类器 车牌识别
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (计算机网络)物理层
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (三十)Flask之wtforms库【剖析源码上篇】
  • (十七)Flink 容错机制
  • (转载)PyTorch代码规范最佳实践和样式指南