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

每日一题 416 分割等和子集(01背包)

题目

分割等和子集
给你一个 只包含正整数 的 非空 数组 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

题解

记忆化搜索

class Solution {private int[] nums;//这里如果定义布尔数组的话将会无法存储已经遍历的路径private int[][] cache;public boolean canPartition(int[] nums) {int target = 0;for (int x : nums) {target += x;}if (target % 2 != 0 || target < 0) {return false;}target /= 2;this.nums = nums;int n = nums.length;cache = new int[n][target + 1];for (int i = 0; i < n; i++) {Arrays.fill(cache[i],-1);}return dfs(n - 1, target);}public boolean dfs (int i, int c) {if (i < 0) {return c == 0;}if (cache[i][c] != -1) {return cache[i][c] > 0 ? true : false;}if (c < nums[i]) {cache[i][c] = dfs(i - 1, c) ? 1 : 0;return dfs(i - 1, c);}cache[i][c] = (dfs(i - 1, c) || dfs(i - 1, c - nums[i])) ? 1 : 0; return dfs(i - 1, c) || dfs(i - 1, c - nums[i]);}
}

1:1递推

两个数组空间优化

class Solution {public boolean canPartition(int[] nums) {int target = 0;for (int x : nums) {target += x;}if (target % 2 != 0 || target < 0) {return false;}target /= 2;int n = nums.length;boolean[][] f = new boolean[2][target + 1];f[0][0] = true;for (int i = 0; i < n; i++) {for (int c = 0; c <= target; c++) {if (c < nums[i]) {f[(i + 1) % 2][c] = f[i % 2][c];} else {f[(i + 1) % 2][c] = f[i % 2][c] || f[i % 2][c - nums[i]];}}}return f[n % 2][target];}
}

一个数组空间优化

class Solution {public boolean canPartition(int[] nums) {int target = 0;for (int x : nums) {target += x;}if (target % 2 != 0 || target < 0) {return false;}target /= 2;int n = nums.length;boolean[] f = new boolean[target + 1];f[0] = true;for (int x : nums) {for (int c = target; c >= x; c--) {f[c] = f[c] || f[c - x];}}return f[target];}
}
http://www.lryc.cn/news/181780.html

相关文章:

  • U盘插上就显示让格式化是坏了吗?
  • 分布式应用程序协调服务 ZooKeeper 详解
  • Anniversary party(树形dp 基础题)
  • Junit的常用操作
  • Elasticsearch安装并使用Postman访问
  • Pytorch深度学习训练模型保存问题,找不到保存路径
  • 数据结构与算法之堆: Leetcode 23. 合并 K 个升序链表 (Typescript版)
  • 代码随想录算法训练营第五十七天 | 392.判断子序列 115.不同的子序列
  • Kafka日志索引详解以及生产常见问题分析与总结
  • vue中 css scoped原理
  • tf.compat.v1.global_variables()
  • 登录注册实现
  • Push rejected: Push to origin/master was rejected
  • 在线OJ项目核心思路
  • Spring MVC:数据绑定
  • STM32CubeMX学习笔记-USB接口使用(HID按键)
  • C#,数值计算——Ranq2的计算方法与源程序
  • C/C++ 数据结构 - 链表
  • 【算法基础】一文掌握十大排序算法,冒泡排序、插入排序、选择排序、归并排序、计数排序、基数排序、希尔排序和堆排序
  • javascript二维数组(3):指定数组元素的特定属性进行搜索
  • 使用Qt进行HTTP通信的方法
  • 第45节——页面中修改redux里的数据
  • 软考 系统架构设计师系列知识点之软件架构风格(2)
  • 【C++11】Lambda 表达式:基本使用 和 底层原理
  • 【网络安全---ICMP报文分析】Wireshark教程----Wireshark 分析ICMP报文数据试验
  • 【Docker】Docker的应用包含Sandbox、PaaS、Open Solution以及IT运维概念的详细讲解
  • Java Applet基础
  • 【记录】IDA|IDA怎么查看当前二进制文件自动分析出来的内存分布情况(内存范围和读写性)
  • LIMS实验室信息管理系统源码 基于计算机的数据处理技术、数据存储技术、网络传输技术、自动化仪器分析技术于一体
  • 有效括号相关