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

LeetCode 416、606题解(中等dp、回溯)

class Solution {
    public boolean canPartition(int[] nums) {
        int n = nums.length;
        /*计算总和*/
        int targetSum = 0;
        int maxNum = 0;
        for(int num:nums){
            targetSum+=num;
            maxNum = Math.max(maxNum,num);
        }
        if(targetSum%2!=0){
            return false;
        }
        int target = targetSum/2;
        /*[1,2,3,8]*/
        if(maxNum>target){
            return false;
        }
        boolean[] dp = new boolean[target+1];
        Arrays.fill(dp,false);
        dp[0] = true;

        for(int i=0;i<n;i++){
            int num = nums[i];
            for(int j=target;j>=num;j--){
                dp[j] |= dp[j-num];
            }
        }

        return dp[target];
    }
}

看示例来理解dp的构造

root=[1,5,11,5]

new dp[11+1]
Arrays.fill(dp,false);
dp[0] = true;

进行第三轮的循环后 解释一下
dp = [true, true, false, false, false, true, true, false, false, false, true, true]

假设我们正在解决一个分割等和子集问题,数组 nums = {1, 5, 11, 5},并且我们已经计算了目标值 target = sum / 2 = 11。这个 dp 数组就是在尝试从数组 nums 中选择子集,使得它们的和达到 target = 11 时的结果。

dp[0] = true:和为 0 的子集是空集,总是成立。
dp[1] = true:表示我们可以选择元素 1 来得到和为 1 的子集。
dp[2] = false:表示不能通过任何子集的元素组合得到和为 2
dp[3] = false:表示不能通过任何子集的元素组合得到和为 3
dp[4] = false:表示不能通过任何子集的元素组合得到和为 4
dp[5] = true:表示我们可以通过选择元素 5 得到和为 5 的子集(例如 {5})。
dp[6] = true:表示我们可以通过选择元素 15 得到和为 6 的子集(例如 {1, 5})。
dp[7] = false:表示不能通过任何子集的元素组合得到和为 7
dp[8] = false:表示不能通过任何子集的元素组合得到和为 8
dp[9] = false:表示不能通过任何子集的元素组合得到和为 9
dp[10] = true:表示我们可以通过选择元素 55 得到和为 10 的子集(例如 {5, 5})。
dp[11] = true:表示我们可以通过选择元素 155 得到和为 11 的子集(例如 {1, 5, 5})。

回溯

当回溯到子叶时,子叶的root.left.val等于root.right.val直接返回s,如果是节点,就根据节点的子叶的两种情况进行回溯

if(l.isEmpty()) return s+"()"+"("+r+")";
if(r.isEmpty()) return s+"("+l+")";
class Solution{
	public String tree2str(TreeNode root){
		if(root==null) return '';
		String s = String.valueOf(root.val);
		String l = tree2str(root.left);
		String r = tree2str(root.right);
		if(l.isEmpty()||r.isEmpty()){
			if(l==r) return s;
			if(l.isEmpty()) return s+"()"+"("+r+")";
			if(r.isEmpty()) return s+"("+l+")";
		}
		return s+"("+l+")"+"("+r+")";
	}
}

当情况如下所示则会调用该return值

return s+"("+l+")"+"("+r+")";

可以使用StringBuilder去代替String使得速度快一些

相关文章:

  • FPGA_DDR(一) 仿真
  • continew-admin的报错问题
  • HTTPS在信息传输时使用的混合加密机制,以及共享、公开密钥加密的介绍。
  • Java Flow 编程:异步数据流介绍
  • 学习日记-0407(Inductive Matrix Completion Using Graph Autoencoder)
  • C盘清理——快速处理
  • SOLIDWORKS 2025教育版有效的数据管理与团队协作
  • Android studio学习之路(六)--真机的调试以及多媒体照相的使用
  • NXP i.MX 平台下双平台设备驱动解析:`imx-lcdifv3` 与 `imx-drm` 的实战解剖
  • Android 学习之 Navigation导航
  • 实时图表工具GLG Toolkit 在 Web HMI/SCADA 领域的卓越实践
  • ubuntu wifi配置(命令行版本)
  • 设计模式之解释器模式:原理、实现与应用
  • 大数据(5)Spark部署核弹级避坑指南:从高并发集群调优到源码级安全加固(附万亿级日志分析实战+智能运维巡检系统)
  • 【项目管理】第4章 信息系统管理 --知识点整理
  • Perl语言的WebAssembly
  • idea 打不开terminal
  • 工业4.0时代:RK3588边缘工业计算机助力AGV导航升级
  • 一句话,十分钟,一部片!
  • 第一部分——Docker篇 第二章 Docker安装
  • 2015年做哪些网站致富/网络技术推广服务
  • 网站建设毕业实践设计报告/重庆seo管理平台
  • 网站建设要求 牛商网/线下推广方案
  • 镇江网站建设网站/卖网站链接
  • 嘉兴网站建设公司/网络推广方式主要有
  • 营销型网站建设的费用报价单/今日国内热点新闻头条事件