力扣爆刷第129天之动态规划五连刷(完全平方数、单词拆分、打劫劫舍)

力扣爆刷第129天之动态规划五连刷(完全平方数、单词拆分、打劫劫舍)

文章目录

      • 力扣爆刷第129天之动态规划五连刷(完全平方数、单词拆分、打劫劫舍)
      • 一、279. 完全平方数
      • 二、139. 单词拆分
      • 三、198.打家劫舍
      • 四、213. 打家劫舍 II
      • 五、337. 打家劫舍 III

一、279. 完全平方数

题目链接:https://leetcode.cn/problems/perfect-squares/description/
思路:本题和最少零钱兑换是一样的,都是完全背包求最小数量,但是求的是用的物品的最小数量,这个物品不用区分组合还是排序,只要是最小数量就可以,所以完全背包,物品和背包谁内谁外都可以,不影响,定义dp[i]表示背包为N时装满所需的最小物品数量为dp[i]。
另外谨记:
如果求组合数就是外层for循环遍历物品,内层for遍历背包。

如果求排列数就是外层for遍历背包,内层for循环遍历物品。

class Solution {
    public int numSquares(int n) {
        int[] dp = new int[n+1];
        Arrays.fill(dp, Integer.MAX_VALUE);
        dp[0] = 0;
        for(int i = 1; i*i <= n; i++) {
            for(int j = i*i; j <= n; j++) {
                dp[j] = Math.min(dp[j], dp[j-i*i]+1);
            }
        }
        return dp[n];
    }
}


二、139. 单词拆分

题目链接:https://leetcode.cn/problems/word-break/description/
思路:单词拆分中的单词可以不限数量,问能否拼接为字符串,拼接是讲究顺序的,显然是完全背包求排列数,背包在外,物品在内。
递推公式:完全背包求组合数和排列数都是一个公式 dp[i] = dp[i-nums[j]]。

class Solution {
    public boolean wordBreak(String s, List<String> wordDict) {
        boolean[] dp = new boolean[s.length()+1];
        dp[0] = true;
        for(int i = 1; i < dp.length; i++) {
            for(String t : wordDict) {
                if(t.length() > i || dp[i] || !isTrue(s, t, i-t.length(), i)) continue;
                dp[i] = dp[i-t.length()];
            }
        }
        return dp[s.length()];
    }
    
    boolean isTrue(String s, String t, int x, int y) {
        int i = 0;
        while(x < y) {
            if(s.charAt(x) != t.charAt(i)) return false;
            x++;
            i++;
        }
        return true;
    }
    
}

三、198.打家劫舍

题目链接:https://leetcode.cn/problems/house-robber/description/
思路:打家劫舍是一个经典问题,不能连续偷一家,所以对于每天有两种选择,即偷与不偷,偷的话,就依赖于前前家的结果,不偷的话,就依赖于前一天,故dp[i] = Math.max(dp[i-1], dp[i-2]+nums[i])。

class Solution {
    public int rob(int[] nums) {
        if(nums.length == 1) return nums[0];
        int a = nums[0], b = Math.max(a, nums[1]), c = 0;
        for(int i = 2; i < nums.length; i++) {
            c = Math.max(b, a + nums[i]);
            a = b;
            b = c;
        }
        return b;
    }
}

四、213. 打家劫舍 II

题目链接:https://leetcode.cn/problems/house-robber-ii/description/
思路:本题是一个变形,就是可以变成了一个环形数组,需要分情况考虑首尾问题,因为不能偷相邻的两家,所以,可以直接逻辑分割成两个数组,一个包含头[0, len-1],一个包含尾[1, len]。然后分别在两个区间上去求最大值。

class Solution {
    public int rob(int[] nums) {
        if(nums.length == 1) return nums[0];
        if(nums.length == 2) return Math.max(nums[0], nums[1]);
        int a = getMax(nums, 0, nums.length-2);
        int b = getMax(nums, 1, nums.length-1);
        return Math.max(a, b);
    }

    int getMax(int[] nums, int left, int right) {
        int a = nums[left], b = Math.max(a, nums[left+1]), c = 0;
        for(int i = left + 2; i <= right; i++) {
            c = Math.max(b, a + nums[i]);
            a = b;
            b = c;
        }
        return b;
    }
}

五、337. 打家劫舍 III

题目链接:https://leetcode.cn/problems/house-robber-iii/description/
思路:本题又是一个变体,虽然也是大家劫舍,但是变成了树的遍历了,也是要求不能同时偷一个家,那么对于每一个节点也是有两种选择,即偷与不偷,该节点偷的话,左右子节点就不能偷,该节点不偷的话,左右子节点偷与不偷都行记录最大值就可以。所以采用后序遍历,对于动态规划来说,无法就是状态与选择,把握住这个所有的动态规划都手拿把掐。

class Solution {
    public int rob(TreeNode root) {
        int[] dp = traverse(root);
        return Math.max(dp[0], dp[1]);
    }
    
    int[] traverse(TreeNode root) {
        if(root == null) {
            return new int[2];
        }
        int[] left = traverse(root.left);
        int[] right = traverse(root.right);
        int[] dp = new int[2];
        dp[0] = root.val + left[1] + right[1];
        dp[1] = Math.max(left[0], left[1]) + Math.max(right[0], right[1]);
        return dp;
    }
    
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/582784.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【优质书籍推荐】ChatGLM3大模型本地化部署、应用开发与微调

大家好&#xff0c;我是爱编程的喵喵。双985硕士毕业&#xff0c;现担任全栈工程师一职&#xff0c;热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。…

Latex入门教学——常用语句介绍

目录 一、导言 二、正文 三、图片 四、公式 五、表格 六、参考文献 LaTex模板下载 IEEE模板&#xff1a;IEEE Article Templates - IEEE Author Center Journals通用模板&#xff1a;Overleaf, Online LaTeX Editor其他方法&#xff1a;百度&#xff0c;CSDN等。 一、导…

华为校招机试 - 满二叉搜索树查找(20240424)

在线OJ测试 题目详情 - 满二叉搜索树查找 - HydroOJ 题目描述 给定 (2^n) - 1 个不同的整数(1 ≤ n ≤ 10,n 为整数),构建一棵平衡满二叉搜索树。 二叉搜索树定义如下: 节点的左子树只包含小于当前节点的数节点的右子树只包含大于当前节点的数所有左子树和右子树自身必…

为什么有些3D模型导入总是渲染不出来?---模大狮模型网

在使用3D建模软件时&#xff0c;有时候会遇到一些导入模型后无法正确渲染的问题&#xff0c;这给用户带来了不便和困扰。本文将探讨一些可能导致3D模型无法渲染的原因&#xff0c;并提供解决方案&#xff0c;帮助您顺利渲染模型。 一、文件格式不兼容某些3D建模软件只支持特定的…

SDA616 600KHz、16V、2A同步降压转换器

一般说明 该SDA616是一个完全集成&#xff0c;高效率2A同步整流降压转换器。该SDA616工作在一个宽的输 出电流负载范围高效率。该器件提供两种工作模式&#xff0c;PWM控制和PFM模式开关控制&#xff0c;它允许在更宽的负载范围内的高效率。 该SDA616需要一个现…

电脑开机后卡在开机LOGO画面如何排查处理

当电脑开机后长时间停滞在开机LOGO画面,无法继续进入操作系统,这一现象常令用户困扰不已。本文将深入探讨导致此类问题的多种可能原因,并提供相应的解决方法,帮助你有效地诊断和排除故障。 硬件故障或接触不良 1. 硬盘问题:硬盘是系统启动的关键组件,其故障或数据线接触…

RAG Survey

本文翻译自&#xff1a;Retrieval-Augmented Generation for Large Language Models: A Survey https://arxiv.org/pdf/2312.10997 文章目录 摘要一、INTRODUCTION二、RAG概述A. Naive RAGB. Advanced RAGC. Modular RAGD. RAG与微调 三、 检索A. 检索来源1&#xff09; 数据结…

Qt客服端开发的组件库

Qt 是一个功能丰富的跨平台 C 应用程序框架&#xff0c;它包含了许多用于不同目的的组件库。以下是一些主要的 Qt 组件库&#xff0c;这些库为开发者提供了广泛的工具和功能&#xff0c;以便构建复杂的应用程序。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&a…

短信接口如何快速对接

短信大家都不陌生&#xff0c;基本上我们每天都会收到各种各样的短信&#xff0c;内容有些是营销类的&#xff0c;有些是数字验证码&#xff0c;有些是快递取件码类似的通知短信&#xff0c;这些短信内容都是通过短信接口触发来进行发送的&#xff0c;那么你知道短信接口如何快…

绘制签章 乱码问题 (踩坑日记)

签章汉字乱码问题 原因:我们在docker上因为没有汉字字体需要我们手动把文件打进去 注意点:如果开启了打包过滤加上字体不过滤 绘制签章转载

数海启航:数学与人工智能的深度交织

在人类文明的长河中&#xff0c;数学始终扮演着探秘未知、构建理论框架的基石角色。随着科技的飞速发展&#xff0c;尤其是人工智能&#xff08;AI&#xff09;的兴起&#xff0c;数学与这一前沿领域的结合愈发紧密&#xff0c;成为推动AI进步的最强引擎。 一、数学&#xff1a…

【操作系统复习资料】(持续更新中)

目录 第一章&#xff1a;操作系统引论 第二章&#xff1a;进程的描述与控制 未完待续。。。。。接 第三章&#xff1a;处理机调度与死锁 第四章&#xff1a;存储器管理 第五章&#xff1a;虚拟存储器 第六章&#xff1a;第八节 磁盘存储器的性能和调度 第一章&#xff1a…

Docker深入探索:网络与资源控制、数据管理与容器互联以及镜像生成

目录 一、 Docker网络 &#xff08;一&#xff09;Docker网络实现原理 &#xff08;二&#xff09;Docker网络模式 1. Bridge网络&#xff08;默认&#xff09; 2. Host网络 3. None网络 4. Container网络 5. 自定义网络 二、资源控制 &#xff08;一&#xff09;cgr…

windows下pysqlite3安装

pysqlite3 下载地址&#xff1a;SQLite Download Page windows下安装 首先在官网中下载以下文件 sqlite-amalgamation-3450300.zip #源码文件 sqlite-dll-win-x64-3450300.zip # 根据系统选择32或者64&#xff0c;可通过查看我的电脑属性中查看 sqlite-tools-win-x64-345…

万兆以太网MAC设计(9)数据流仲裁模块

文章目录 一、模块接口二、模块功能描述2.1、实现思路 三、仿真3.1、仿真设计3.2、仿真波形 总结&#xff1a; 一、模块接口 c0和c1表示输入的俩个数据通道&#xff0c;c0优先级高&#xff0c;P_ARBITER_LAYER 表示当前是在IP层进行仲裁还是MAC层&#xff0c;可复用于俩个模块…

每日算法之对称二叉树

题目描述 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true 示例 2&#xff1a; 输入&#xff1a;root [1,2,2,null,3,null,3] 输出&#xff1a;false 提示&#xff1a; …

c# 构造函数 静态构造函数 内联字段(即静态字段和实例字段) 父类构造函数 父类静态构造函数 父类内联字段 执行顺序

顺序如下&#xff1a; 1.子类的内联字段 2.子类的静态构造函数 3.父类的内联字段 4.父类的静态构造函数 5.父类的构造函数 6.子类的构造函数 7.子类的方法 public class A{public static string a1"A0";static A(){Console.WriteLine("父类内联字段&#xff1a;…

内网安全【1】——域信息收集/应用网络凭证/CS插件/Android/BloodHound

内容大纲&#xff1a; 概念名词&#xff1a; 局域网 &#xff08;自己家&#xff09; 工作组 &#xff08;网吧&#xff09; 内网域 &#xff08;公司&#xff09; 比如一家公司有1000台机器 运维人员去管理1000 不可能每台上去都进行软件的安装 环境的部署 密码的设置…

VSCODE通过SFTP链接VM进行开发

在vscode插件里面搜索sftp&#xff0c;安装。 安装之后&#xff0c;按ctrlshiftp&#xff0c;找到sftp的config 然后填写刚刚的IP&#xff0c;然后是你的用户名密码 如果是通过密钥链接的话就是这样配置 然后切换到这个sftp的tab里面 然后在你的项目右键&#xff0c;然后选择op…

Linux实现简单进度条(附原理解释和动图效果)

1&#xff0c;行缓冲区 先看下面的代码和运行结果&#xff0c; #include<stdio.h> #include<unistd.h> int main() {printf("你好\n");sleep(3);return 0; }只是一个简单的打印“你好”然后休眠三秒&#xff0c;最后程序结束 再看下面的代码和运行结果…
最新文章