LeetCode 热题 100 | 动态规划(一)

目录

1  70. 爬楼梯

1.1  基本思路

1.2  官方题解

2  118. 杨辉三角

3  198. 打家劫舍


菜鸟做题,语言是 C++

1  70. 爬楼梯

核心思想:把总问题拆解为若干子问题。

  • 总问题:上到 5 楼的方式有多少种
  • 子问题:上到 4 楼的方式有多少种、上到 3 楼的方式有多少种
  • 总问题 = 子问题 1 + 子问题 2

因为题目要求每次只能爬 1 或 2 个台阶,所以子问题只有两个。

1.1  基本思路

假设按照英国算法要爬 6 层楼,如下图所示:

使用一个名为 dp 的数组来存储爬到每一层楼的方式种数。

由于我们只能从 4 或 3 楼爬到 5 楼,因此爬到 5 楼的方式种数 = 爬到 4 楼的方式种数 + 爬到 3 楼的方式种数,即 dp[5] = dp[4] + dp[3],以此类推。

特别地,对于 0 楼和 1 楼,由于只有一种方式爬到它们,因此直接设为 1 即可。

很不幸,上述方法需要维护一个长为 n 的数组 dp,因此空间复杂度是 O(n),而这样会超出内存限制,下面来看官方题解的奇妙方法。

1.2  官方题解

由 1.1 节的分析可知,dp[5] 只与 dp[4] 和 dp[3] 有关。因此在第 5 时刻,我们只需要记住 dp[4] 和 dp[3] 即可。换句话说,就是通过忘记其他 dp 元素来节省内存空间。

如下图所示。我们设置变量 p、q、r 来分别存储 dp[i - 2]、dp[i - 1]、dp[i],并不断更新这些变量。

可以把 p、q、r 理解为一个滑动窗口,每次同时向后移动一格,以此忘记不再需要的 dp 元素。 

完整代码如下:

class Solution {
public:int climbStairs(int n) {int p = 0, q = 0, r = 1;for (int i = 0; i < n; ++i) {p = q;q = r;r = p + q;}return r;}
};

这个启动方式还是挺妙的:

int p = 0, q = 0, r = 1;

2  118. 杨辉三角

核心思想:把总问题拆解为若干子问题。

  • 总问题:第 i 行第 j 列元素的值
  • 子问题:第 i - 1 行第 j 列元素的值、第 i - 1 行第 j + 1 列元素的值
  • 总问题 = 子问题 1 + 子问题 2

模仿上述动图初始化 ans 数组:

vector<vector<int>> ans(numRows);
for (int i = 1; i <= numRows; ++i) {ans[i - 1].resize(i);ans[i - 1][0] = 1;ans[i - 1][i - 1] = 1;
}

就是把那一圈 “1” 先填了,虽然笨,但貌似不影响效率。

完整代码如下:

class Solution {
public:vector<vector<int>> generate(int numRows) {vector<vector<int>> ans(numRows);for (int i = 1; i <= numRows; ++i) {ans[i - 1].resize(i);ans[i - 1][0] = 1;ans[i - 1][i - 1] = 1;}for (int i = 2; i < numRows; ++i) {for (int j = 1; j < ans[i].size() - 1; ++j) {ans[i][j] = ans[i - 1][j - 1] + ans[i - 1][j];}}return ans;}
};

3  198. 打家劫舍

核心思想:把总问题拆解为若干子问题。

  • 总问题:打劫完第 i 家所获最大金额
  • 子问题:打劫完第 i - 2 家所获最大金额、打劫完第 i - 3 家所获最大金额
  • 总问题 = 子问题 1 + 子问题 2

Q:为什么只考虑打劫第 i - 2 家和第 i - 3 家?

A:假设 i = 5,如下图所示。对于第 i - 1 家,由于不能打劫相邻的两家,因此要想打劫第 i 家,就不能打劫第 i - 1 家。可以打劫第 i - 2 家或者第 i - 3 家,如情况一和情况二所示。对于第 i - 4 家,由于要使金额最大,因此肯定还会打劫第 i - 2 家,从而认为情况一等价于情况三。

综上,我们只需要考虑情况一和情况二即可。

同  70. 爬楼梯  的简化思路相同,我们同样可以只设置几个变量来存储历史打劫金额,而非使用一个 dp 数组。其中,h3 存储第 i - 3 家,h2 存储第 i - 2 家,h1 存储第 i - 1 家,h0 存储第 i 家。

完整代码如下:

class Solution {
public:int rob(vector<int>& nums) {int h3 = 0, h2 = 0, h1 = 0;int ans = INT_MIN;for (int i = 0; i < nums.size(); ++i) {int h0 = max(nums[i] + h3, nums[i] + h2);ans  = max(ans, h0);h3 = h2;h2 = h1;h1 = h0;}return ans;}
};

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

炫我科技:云渲染领域的佼佼者

随着数字化时代的来临&#xff0c;云渲染技术正逐渐成为影视、游戏、动画等创意产业的重要支柱。在这一领域中&#xff0c;炫我科技凭借其卓越的技术实力、优质的服务以及不断创新的精神&#xff0c;已然成为了云渲染行业的佼佼者。 炫我科技自成立之初&#xff0c;便以打造高…

SV学习笔记(二)

接口 什么是接口&#xff1f; 接口 主要用作验证 &#xff0c;国外有些团队会使用sv进行设计&#xff0c;那么接口就会用作设计。验证环境中&#xff0c;接口可以 使连接变得简洁而不易出错 。interface和module的使用性质很像&#xff0c; 可以定义端口&#xff0c;也可以定…

基于单片机的炉温控制系统设计

**单片机设计介绍&#xff0c;基于单片机的炉温控制系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的炉温控制系统设计是一个融合了单片机技术、温度传感技术、控制算法以及硬件电路设计等多个领域的综合性项…

在ChatGPT中,能用DALL·E 3编辑图片啦!

4月3日&#xff0c;OpenAI开始向部分用户&#xff0c;提供在ChatGPT中的DALLE 3图片编辑功能。 DALLE 3是OpenAI在2023年9月20日发布的一款文生图模型&#xff0c;其生成的图片效果可以与Midjourney、leonardo、ideogram等顶级产品媲美&#xff0c;随后被融合到ChatGPT中增强其…

【BlossomConfig】SpringCloud项目是如何对bootstrap配置文件进行加载的?

文章目录 bootstrap配置文件的读取什么是配置中心&#xff1f;以及如何实现一个配置中心&#xff1f;SpringBoot如何实现配置的管控&#xff1f;SpringCloud项目是如何对bootstrap配置文件进行加载的&#xff1f;Nacos是如何实现配置文件的读取加载的&#xff1f;开发配置中心前…

一次普通的漏洞挖掘思路分享

No.0 前言 一名web安全小白&#xff0c;自己仅学了一点思路&#xff0c;直接实战&#xff0c;运气不错&#xff0c;碰到了管理员弱口令&#xff0c;进入后台后&#xff0c;继续测试自己学会的思路挖掘深一点的漏洞&#xff0c;这里与各位分享一下&#xff0c;如果有更多的思路…

MMU关闭时Cache的缓存策略是怎样的

快速链接: 【精选】ARMv8/ARMv9架构入门到精通-[目录] &#x1f448;&#x1f448;&#x1f448; 在学习MMU章节时&#xff0c;我们发现在页表的entry中&#xff0c;BIT[4:2]指向了MAIR寄存器&#xff0c;该寄存器描述了内存属性&#xff0c;其实就是cache的缓存策略属性&#…

洛谷-P1706 全排列问题(DFS)

目录 题目链接&#xff1a; 思路&#xff1a; 代码&#xff1a; 题目链接&#xff1a; P1706 全排列问题 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路&#xff1a; 如果n比较小&#xff0c;可以写n个for循环输出全排列。但是这种简单方法只能用于较小的n&#xff0…

Vue依赖注入,详细解析

Prop 逐级透传问题​ 通常情况下&#xff0c;当我们需要从父组件向子组件传递数据时&#xff0c;会使用 props。想象一下这样的结构&#xff1a;有一些多层级嵌套的组件&#xff0c;形成了一颗巨大的组件树&#xff0c;而某个深层的子组件需要一个较远的祖先组件中的部分数据。…

C++心决之内联函数+auto关键字+指针空值

目录 7.内联函数 7.1 概念 7.2 特性 8. auto关键字(C11) 8.1 类型别名思考 8.2 auto简介 8.3 auto的使用细则 8.4 auto不能推导的场景 9. 基于范围的for循环(C11) 9.1 范围for的语法 9.2 范围for的使用条件 10. 指针空值nullptr(C11) 10.1 C98中的指针空值 7.内联…

水质监测站:守护水源,筑牢水质安全屏障

TH-LSZ06水质监测站&#xff0c;作为现代水质监测技术的创新成果&#xff0c;以其高效、便捷的特点&#xff0c;在水源保护、环境监测等领域发挥着越来越重要的作用。它不仅能够实时监测水质变化&#xff0c;提供准确的数据支持&#xff0c;还能为水质安全管理提供科学依据&…

深入理解Java内存模型及其作用

目录 1.前言 2.为什么要有 Java 内存模型&#xff1f; 2.1 一致性问题 2.2 重排序问题 3.Java 内存模型的定义 4.规范内容 4.1 主内存和工作内存交互规范 4.2 什么是 happens-before 原则&#xff1f; 1.前言 当问到 Java 内存模型的时候&#xff0c;一定要注意&#…