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

力扣416. 分割等和子集(java 动态规划)

Problem: 416. 分割等和子集

文章目录

  • 题目描述
  • 思路
  • 解题方法
  • 复杂度
  • Code

题目描述

在这里插入图片描述

思路

该题目可以归类为0-1背包问题,具体到细节可以再归纳为背包是否装满问题

1.首先判断数组元素和的奇偶性(奇数则不能划分)
2.我们定义一个二维布尔类型数组,用于记录每一阶段的可选状态
3.针对于动态转移方程:我们要判断最终是否可以选取一些数使其和为原来数组元素和的一半,即通过一层一层的选择数(状态转移),判断最终状态是否可达(能否有一组数使得其和为原来数组元素和的一半)每一个位置都会有选与不选两种状态,若选取则dp[i][j] == dp[i - 1][j - nums[i]],若不选取则dp[i][j] == dp[i - 1][j];则我们可以知道每一个位置的状态只取决于上一层的两个位置的状态即 dp[i][j] == dp[i - 1][j] || dp[i - 1][j - numsi

解题方法

1.获取数组的长度(假设为 n n n),统计数组所有元素的和(假设为 s u m sum sum)并判断若 s u m sum sum为奇数则直接返回false,否则将 s u m sum sum除以2;
2.定义一个Boolean类型的二维数组dp(行数为 n n n,列数为 s u m + 1 sum + 1 sum+1),用于记录每个状态,初始化(将dp[0][0]位置设置为true),并判断若*nums[0]位置值小于sum(注意sum已经除等于2了)*则将dp[0][nums[0]]位置设为true,这样就将第0层的所有状态设置完毕
3.我们从dp数组的第一层开始遍历,并完成动态转移,在没有越界(此处笔者感觉也不能就叫做越界,但是思想和上述思路中的动态转移是一致的。执行该if判断只是为了更好契合该dp数组。读者可以尝试画一画dp数组演示一边便可理解)的情况下(if (j - nums[i] >= 0))则dp[i][j] = dp[i - 1][j] || dp[i - 1][j - nums[i]];否则dp[i][j] = dp[i - 1][j];
4.返回最终位置的状态即**dp[n - 1][sum]**位置的状态

复杂度

时间复杂度:

O ( M N ) O(MN) O(MN);其中 M M M为数组长度, N N N为数组元素和的一半

空间复杂度:

O ( M N ) O(MN) O(MN);其中 M M M为数组长度, N N N为数组元素和的一半

Code

class Solution {/*** Similar to the 0-1 knapsack problem (can the knapsack be filled?)** @param nums Given arrays* @return boolean*/public boolean canPartition(int[] nums) {int n = nums.length;int sum = 0;for (int i = 0; i < n; ++i) {sum += nums[i];}//Indivisible if oddif (sum % 2 == 1) {return false;}sum /= 2;//Records whether each node is reachableboolean[][] dp = new boolean[n][sum + 1];dp[0][0] = true;if (nums[0] <= sum) {dp[0][nums[0]] = true;}//State transition equationfor (int i = 1; i < n; ++i) {for (int j = 0; j <= sum; ++j) {//Determine whether the line has been crossedif (j - nums[i] >= 0) {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][sum];}
}

相关文章:

  • Oraclelinux部署Oracle服务
  • 主流级显卡的新选择,Sparkle(撼与科技)Intel Arc A750兽人体验分享
  • 第九部分 图论
  • Spark编程实验三:Spark SQL编程
  • GrayLog日志平台的基本使用-ssh接入Dashboards展示
  • 使用python netmiko模块批量配置Cisco、华为、H3C路由器交换机(支持 telnet 和 ssh 方式)
  • QT 输入框输入限制 正则表达式限制 整理
  • Midjourney v6 正式发布,AI创新工坊同步更新
  • 与擎创科技共建一体化“数智”运维体系,实现数字化转型
  • 在k8s中将gitlab-runner的运行pod调度到指定节点
  • 【学习笔记】Java函数式编程03 Stream流-终结操作
  • 在ajax中使用callback
  • CNVD原创漏洞审核和处理流程
  • Python in Visual Studio Code 2023年12月发布
  • 基于 Linux 的批量上传本地 Git 仓库到 Github 的实践
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • Flex布局到底解决了什么问题
  • JavaScript实现分页效果
  • js面向对象
  • PV统计优化设计
  • React 快速上手 - 07 前端路由 react-router
  • Redis字符串类型内部编码剖析
  • 反思总结然后整装待发
  • 译有关态射的一切
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • #传输# #传输数据判断#
  • (1)(1.9) MSP (version 4.2)
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (30)数组元素和与数字和的绝对差
  • (ZT)一个美国文科博士的YardLife
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (四)图像的%2线性拉伸
  • (五)MySQL的备份及恢复
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • .net 流——流的类型体系简单介绍
  • .NET 中让 Task 支持带超时的异步等待
  • .NET开发不可不知、不可不用的辅助类(三)(报表导出---终结版)
  • @transaction 提交事务_【读源码】剖析TCCTransaction事务提交实现细节
  • [ Linux ] Linux信号概述 信号的产生
  • [20140403]查询是否产生日志
  • [2017][note]基于空间交叉相位调制的两个连续波在few layer铋Bi中的全光switch——
  • [20171106]配置客户端连接注意.txt
  • [APUE]进程关系(下)
  • [bzoj2957]楼房重建
  • [C语言]——函数递归
  • [dts]Device Tree机制
  • [ICCV2017]Neural Person Search Machines
  • [LeetCode]Multiply Strings
  • [one_demo_9]判断数组是否递增
  • [opencvsharp]C#基于Fast算法实现角点检测
  • [OpenWrt]RAX3000一根线实现上网和看IPTV
  • [Qt]QMainWindow
  • [QT]加快qt编译:设置默认多核编译qt