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

Leecode热题100-416.分割等和子集

给你一个 只包含正整数 的 非空 数组 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 {public static boolean canPartitionSimple(int[] nums) {/*** 先算一下元素的和是多少*/int sum = 0;for(int num : nums) {sum += num;}/*** 如果sum是个奇数,那直接返回false即可*/if((sum & 1) == 1){return false;}/*** 如果是偶数,我们的目标是sum的一半*/int target = sum >> 1;return canGetTarget(nums, 0, target);}public static boolean canPartition(int[] nums) {/*** 先算一下元素的和是多少*/int sum = 0;for(int num : nums) {sum += num;}/*** 如果sum是个奇数,那直接返回false即可*/if((sum & 1) == 1){return false;}int n = nums.length;/*** 如果是偶数,我们的目标是sum的一半*/int target = sum >> 1;/*** 根据递归,我们知道有两个可变参数:index从0到n,targetNow从0到target*/boolean[][] dp = new boolean[n + 1][target + 1];/*** 如果index=n,那只有targetNow=0的时候才是true,默认为false,所以只需要设置dp[n][0]=true*/dp[n][0] = true;/*** index行依赖于index+1行,所以从后往前遍历,n行已经遍历过了,所以现在从n-1开始* targetNow同行无依赖,所以从0或者从target开始都无所谓*/for(int index = n - 1; index >= 0; index --) {for(int targetNow = 0; targetNow <= target; targetNow ++) {/*** 如果没有越界,当前的位置可以选择要或者不要* 这两种选择只要能有一种是正确的,那就是正确的*//*** 第一种选择:要,targetNow减去当前的* 这种我们需要进行剪枝,如果targetNow - nums[index]小于0了,那后面无论如何也不可能,因为都是正数* 正数不可能拼出负数*/boolean p1 = targetNow - nums[index] < 0? false : dp[index + 1][targetNow - nums[index]];/*** 第二种选择,不要,targetNow不变*/boolean p2 = dp[index + 1][targetNow];dp[index][targetNow] = p1 | p2;}}return dp[0][target];}/*** 递归函数的含义:当前要决策index位置的数要不要,0~index-1的所有数都已经做完决策,不需要关心* 0~index-1之后还剩下targetNow需要拼出来* @param nums* @param index* @param targetNow* @return*/public static boolean canGetTarget(int[] nums, int index, int targetNow) {/*** 如果index已经越界了,那targetNow如果是0,就是正确的尝试,否则不是*/if(index == nums.length) {return targetNow == 0? true : false;}/*** 如果没有越界,当前的位置可以选择要或者不要* 这两种选择只要能有一种是正确的,那就是正确的*//*** 第一种选择:要,targetNow减去当前的* 这种我们需要进行剪枝,如果targetNow - nums[index]小于0了,那后面无论如何也不可能,因为都是正数* 正数不可能拼出负数*/boolean p1 = targetNow - nums[index] < 0? false : canGetTarget(nums, index + 1, targetNow - nums[index]);/*** 第二种选择,不要,targetNow不变*/boolean p2 = canGetTarget(nums, index + 1, targetNow);return p1 | p2;}
}

效果一般,回头再优化吧,先解题


http://www.mrgr.cn/news/57924.html

相关文章:

  • python支付宝支付和回调
  • 如何恢复红米手机中已删除的照片?(6种方法可用)
  • springboot常见题目
  • 喜欢的散文《在更热烈的风里相遇》李汉荣精选散文集
  • 如何在Debian操作系统上安装Doker
  • 上拉电阻和下拉电阻在电路中的作用(一)
  • 6317A可调谐激光源
  • 草地杂草数据集野外草地数据集田间野草数据集YOLO格式VOC格式目标检测计算机视觉数据集
  • 【数据分享】全国各省份资源和环境-废气中主要污染物排放(2011-2021年)
  • AcWing 3534:矩阵幂 ← 矩阵快速幂
  • 中国建设银行广东省分行珠海市分行营业网点装修工程采购项目市场调研供应商征集公告
  • 1024程序员节
  • 二进制安全研究员的成长之路---栈溢出篇(一)
  • 【蓝桥杯选拔赛真题77】python计算小球 第十五届青少年组蓝桥杯python选拔赛真题 算法思维真题解析
  • 时间服务器 NTP协议
  • C++位操作实战:掩码、提取与组装
  • 073_基于springboot+Android的“川味游”app的设计与开发
  • c++学习DAY2
  • Java基于数据库的分布式可重入锁(带等待时间和过期时间)
  • 【Linux】进程调度 | 进程切换上下文数据
  • Genmo 的 Mochi1 AI 视频生成技术:内容创作的新纪元
  • 【C++干货篇】——C/C++内存管理
  • C++【string类的使用】(上)
  • 数据挖掘示例
  • 基于Java的就业信息管理系统源码带本地搭建教程
  • windows|常见的文件伪装方法