笔记1 第13课 动规2 ——买卖股票最佳时机,打家劫舍,零钱找兑——极客时间算法
之前收藏了极客时间的算法训练营3期 共21课,计划每一课写博客来记录学习,主要形式为
方法类型1
题1
题解
题2
题解
方法类型2
题1
题解
……
题目大体来自leetcode 和 acwing
主要记录和理解代码,所以基本完全搬运了视频题解代码,
个人学习感受体现在大致思路的总结和注释上。
第一题
122. 买卖股票的最佳时机 II
每一天都有持股和不持股的两种状态。
初始化时每一种状态初始值都是极小。
class Solution {
public:int maxProfit(vector<int>& prices) {int n = prices.size();prices.insert(prices.begin(), 0);vector<vector<int>> f(n + 1, vector<int>(2, -1e9));f[0][0] = 0;for (int i = 1; i <= n; i++) {f[i][1] = max(f[i][1], f[i - 1][0] - prices[i]);f[i][0] = max(f[i][0], f[i - 1][1] + prices[i]);for (int j = 0; j < 2; j++) {f[i][j] = max(f[i][j], f[i - 1][j]);}}return f[n][0];}
};
第二题
188. 买卖股票的最佳时机 IV
多一些状态而已
class Solution {
public:int maxProfit(int k, vector<int>& prices) {int n = prices.size();prices.insert(prices.begin(), 0);vector<vector<vector<int>>> f(n + 1,vector<vector<int>>(2, vector<int>(k + 1, -1e9)));f[0][0][0] = 0;for (int i = 1; i <= n; i++)for (int j = 0; j < 2; j++) for (int m = 0; m <= k; m++) {//没有用完次数可以尝试买入if (m > 0) f[i][1][m] = max(f[i][1][m], f[i - 1][0][m - 1] - prices[i]);//卖f[i][0][m] = max(f[i - 1][1][m] + prices[i], f[i][0][m]);//歇f[i][j][m] = max(f[i][j][m], f[i - 1][j][m]);}int ans = -1e9;for (int i = 0; i <= k; i++) {//买几次都有可能ans = max(ans, f[n][0][i]);}return ans;}
};
第三题
714. 买卖股票的最佳时机含手续费
只需要每次购买时减去费用即可。
class Solution {
public:int maxProfit(vector<int>& prices, int fee) {int n = prices.size();prices.insert(prices.begin(), 0);vector<vector<int>> f(n + 1, vector<int>(2, -1e9));f[0][0] = 0;for (int i = 1; i <= n; i++) {f[i][1] = max(f[i][1], f[i - 1][0] - prices[i] - fee);f[i][0] = max(f[i][0], f[i - 1][1] + prices[i]);for (int j = 0; j < 2; j++) f[i][j] = max(f[i][j], f[i - 1][j]);}return f[n][0];}
};
第四题
309. 最佳买卖股票时机含冷冻期
今天的状态规划明天的状态,向后规划。
class Solution {
public:int maxProfit(vector<int>& prices) {int n = prices.size();vector<vector<vector<int>>> f(n + 1, vector<vector<int>>(2, vector<int>(2, -1e9)));prices.insert(prices.begin(), 0);f[0][0][0] = 0;for (int i = 0; i < n; i++) {for (int j = 0; j < 2; j++) {for (int k = 0; k < 2; k++){if (j == 0 && k == 0)f[i + 1][1][k] = max(f[i + 1][1][k], f[i][j][k] - prices[i + 1]);if (j == 1)f[i + 1][0][1] = max(f[i + 1][0][1], f[i][j][k] + prices[i + 1]);f[i + 1][j][max(0, k - 1)] = max(f[i + 1][j][max(0, k - 1)], f[i][j][k]);}}}return max(f[n][0][0], f[n][0][1]);}
};
第五题
198. 打家劫舍
之前偷没偷过
class Solution {
public:int rob(vector<int>& nums) {int n = nums.size();vector<vector<int>> f(n + 1, vector<int>(2, -1e9));f[0][0] = 0;nums.insert(nums.begin(), 0);for (int i = 0; i < n; i++) {for (int j = 0; j < 2; j++) {f[i + 1][1] = max(f[i + 1][1], f[i][0] + nums[i + 1]);f[i + 1][0] = max(f[i][0], f[i][1]);}}return max(f[n][1], f[n][0]);}
};
第六题
213. 打家劫舍 II
头尾相接,进行两次递归,第一次尝试偷第一家,第二次尝试最后一家
class Solution {
public:int rob(vector<int>& nums) {int n = nums.size();if (n == 1) return nums[0];//即是头又是尾,特判。nums.insert(nums.begin(), 0);vector<vector<int>> f(2, vector<int>(2, -1e9));//第一次, 可以选择偷第一家f[0][0] = 0;for (int i = 0; i < n; i++){f[i + 1 & 1][0] = max(f[i & 1][0], f[i & 1][1]);f[i + 1 & 1][1] = f[i & 1][0] + nums[i + 1];for (int j = 0; j < 2; j++){f[i & 1][j] = -1e9;}}int ans = f[n & 1][0];f[0][0] = -1e9;f[0][1] = 0;for (int i = 0; i < n; i++){f[i + 1 & 1][0] = max(f[i & 1][0], f[i & 1][1]);f[i + 1 & 1][1] = f[i & 1][0] + nums[i + 1];for (int j = 0; j < 2; j++){f[i & 1][j] = -1e9;}}ans = max(ans, max(f[n & 1][0], f[n & 1][1]));return ans;}
};
第七题
72. 编辑距离
注意初始化的值,为直接构建相应单词所需要的字母数量。
class Solution {
public:int minDistance(string word1, string word2) {int m = word1.length();int n = word2.length();word1 = " " + word1;word2 = " " + word2;vector<vector<int>> f(m + 1, vector<int>(n + 1, 1e9));for (int i = 0; i <= m; i++) f[i][0] = i;for (int i = 0; i <= n; i++) f[0][i] = i;for (int i = 1; i <= m; i++)for (int j = 1; j <= n; j++) {f[i][j] = min(f[i - 1][j - 1] + (word1[i] != word2[j]), min(f[i - 1][j] + 1, f[i][j - 1] + 1));}return f[m][n];}
};
第八题
416. 分割等和子集
即找等于总和一半的子集,
|=可以对int使用,但是bool不行
class Solution {
public:bool canPartition(vector<int>& nums) {int sum = 0;for (int num : nums) sum += num;if (sum % 2 == 1) return false;vector<int> f(sum / 2 + 1, false);f[0] = true;for (int i = 0; i < nums.size(); i++) for (int j = sum / 2; j >= nums[i]; j--) {f[j] |= f[j - nums[i]];}return f[sum / 2];}
};
第九题
518. 零钱兑换 II
完全背包问题,相应位置加上之前位置的方案总和。
class Solution {
public:int change(int amount, vector<int>& coins) {int n = coins.size();coins.insert(coins.begin(), 0);vector<int> f(amount + 1 , 0);f[0] = 1;for (int i = 1; i <= n; i++) {for (int j = coins[i]; j <= amount; j++){f[j] += f[j - coins[i]];}}return f[amount];}
};
笔记1 第13课 动规2 ——买卖股票最佳时机,打家劫舍,零钱找兑——极客时间算法相关推荐
- 笔记1 第11课 贪心初步 ——柠檬水找零,分发饼干,跳跃游戏,完成所有任务所需最小能量——极客时间算法
之前收藏了极客时间的算法训练营3期 共21课,计划每一课写博客来记录学习,主要形式为 方法类型1 题1 题解 题2 题解 方法类型2 题1 题解 -- 题目大体来自leetcode 和 acwing ...
- 【极客时间】《MySQL45讲》学习笔记
内容来源:开篇词 | 这一次,让我们一起来搞懂MySQL-极客时间 以下是来自网友对课程的知识点的分类总结: 本章内容[本章内容建议阅读时长] 编号|建议阅读时长|文章标题 1. 基础知识[12'] ...
- 本人亲自整理的极客时间设计模式之美的硬核笔记
由于笔记内容过多,我把它放到语雀上了. 点击我 以下内容是为了让搜索引擎,检测到这篇文章.要阅读体验,请点击上面的连接"点击我",去我的语雀看.对了,我看到语雀那里有投诉的功能,请 ...
- 极客时间计算机组成原理学习笔记
文章目录 0章-我对学计算机组成原理的思考 学习底层知识对于技术成长来说是复利行为 计算机组成原理是计算机科学的超级目录 第一章 冯诺依曼 在极客时间购买了计算机组成原理的blog专栏,尝试写一下笔记 ...
- 极客时间《Java并发编程》学习笔记
该领域是跟着"极客时间"平台的课程<Java并发编程>入门的,讲师是王宝令.说实话,这个领域如果抱着大部头的书就啃的话,由于缺少实践很难会建立一个体系,即不知道为什 ...
- <极客时间:零基础入门Spark> 学习笔记(持续更新中...)
看的是极客时间的课,讲得很不错 零基础入门 Spark (geekbang.org) 基础知识 01 Spark:从"大数据的Hello World"开始 准备工作 IDEA安装S ...
- 【算法笔记】极客时间 算法面试通关40讲 笔记 覃超
[算法笔记]极客时间 算法面试通关40讲 覃超 [算法笔记]极客时间 算法面试通关40讲 覃超 相关链接 在leetcode 上的题号 数组.链表: (堆)栈stack.队列queue 优先队列 哈希 ...
- 极客时间_软件设计之美 笔记
极客时间_软件设计之美 笔记 1.软件设计是什么 写代码前应该有模型设计 比如mvc结构就是一种模型 代码应该有规范, 产品内部原则 避免每个开发按自己的想法实现,有人写rest 有人写mvc 代码模 ...
- 我和极客时间合作了一门产品创新课
算起来,正好是三个月前,在台北,参加了一个极客邦组织的全球技术领导力峰会GTLC. 详情如文:刚去台湾参了个会,就听说自由行受限了 会上碰到了主办方的老板霍泰稳,聊了一会儿以后,他就邀请我做一门和产品 ...
最新文章
- redisson get()数据报错,missing type id property ‘@class’
- 一块GPU就能训练语义分割网络,百度PaddlePaddle是如何优化的?
- hust1347(归并排序求逆序对)
- SAP Spartacus项目执行yarn prettier-fix命令之后的输出
- 番茄日志发布1.0.3版本-增加Kafka支持
- Java中父类的静态变量和静态方法的继承问题
- Linux系统:centos7下安装Jdk8、Tomcat8、MySQL5.7环境
- 通过配置hosts.allow和hosts.deny文件允许或禁止ssh或telnet操作
- Python学习(六)模块
- (转)Uncaught TypeError: Cannot set property 'innerHTML' of null
- 【原】iOS触摸事件深度解析
- 在chrome上安装印象笔记插件
- 锂电池技术关键突破:水淹火烧重击短路都不炸!三星看了会沉默,特斯拉蔚来听了要流泪...
- 批处理从入门到精通_DOS/BAT
- processing图片粒子化_谈谈文字图片粒子化
- 知识产权服务代理行业税收政策
- 墨刀实现区域内滚动效果
- mysql分组取最新时间的数据
- Hedge fund Two Sigma hires Alfred Spector as Chief Technology Officer
- 全国大学生软件测试大赛Web应用大赛常用测试语句
热门文章
- php站群框架,[文化传媒]TP-Admin 大型CMS站群级后台管理系统 (开源) - 行业交流 - 极思维...
- react学习—ref
- 编写代码的软件用什么编写的_当编写过多的代码可能会杀死您
- 人工智能技术大爆发,离改变世界到底还有多远?【智库2861】
- etl工具linux安装,Centos7下ETL工具之kettle安装
- 谁执行了我的main函数
- Oracle函数介绍:decode
- 人脸检测、人脸跟踪、人脸识别、OpenCV(特征脸、LBPH、费歇脸)
- Azure安装AKS步骤及注意事项
- 计算机软件音乐与游戏电子报纸,燃气红外辐射器的安装高度应根据人体舒适度确定,但不应低于()。A.2mB.3mC.3.5mD.4m...