之前收藏了极客时间的算法训练营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. 笔记1 第11课 贪心初步 ——柠檬水找零,分发饼干,跳跃游戏,完成所有任务所需最小能量——极客时间算法

    之前收藏了极客时间的算法训练营3期 共21课,计划每一课写博客来记录学习,主要形式为 方法类型1 题1 题解 题2 题解 方法类型2 题1 题解 -- 题目大体来自leetcode 和 acwing ...

  2. 【极客时间】《MySQL45讲》学习笔记

    内容来源:开篇词 | 这一次,让我们一起来搞懂MySQL-极客时间 以下是来自网友对课程的知识点的分类总结: 本章内容[本章内容建议阅读时长] 编号|建议阅读时长|文章标题 1. 基础知识[12'] ...

  3. 本人亲自整理的极客时间设计模式之美的硬核笔记

    由于笔记内容过多,我把它放到语雀上了. 点击我 以下内容是为了让搜索引擎,检测到这篇文章.要阅读体验,请点击上面的连接"点击我",去我的语雀看.对了,我看到语雀那里有投诉的功能,请 ...

  4. 极客时间计算机组成原理学习笔记

    文章目录 0章-我对学计算机组成原理的思考 学习底层知识对于技术成长来说是复利行为 计算机组成原理是计算机科学的超级目录 第一章 冯诺依曼 在极客时间购买了计算机组成原理的blog专栏,尝试写一下笔记 ...

  5. 极客时间《Java并发编程》学习笔记

      该领域是跟着"极客时间"平台的课程<Java并发编程>入门的,讲师是王宝令.说实话,这个领域如果抱着大部头的书就啃的话,由于缺少实践很难会建立一个体系,即不知道为什 ...

  6. <极客时间:零基础入门Spark> 学习笔记(持续更新中...)

    看的是极客时间的课,讲得很不错 零基础入门 Spark (geekbang.org) 基础知识 01 Spark:从"大数据的Hello World"开始 准备工作 IDEA安装S ...

  7. 【算法笔记】极客时间 算法面试通关40讲 笔记  覃超

    [算法笔记]极客时间 算法面试通关40讲 覃超 [算法笔记]极客时间 算法面试通关40讲 覃超 相关链接 在leetcode 上的题号 数组.链表: (堆)栈stack.队列queue 优先队列 哈希 ...

  8. 极客时间_软件设计之美 笔记

    极客时间_软件设计之美 笔记 1.软件设计是什么 写代码前应该有模型设计 比如mvc结构就是一种模型 代码应该有规范, 产品内部原则 避免每个开发按自己的想法实现,有人写rest 有人写mvc 代码模 ...

  9. 我和极客时间合作了一门产品创新课

    算起来,正好是三个月前,在台北,参加了一个极客邦组织的全球技术领导力峰会GTLC. 详情如文:刚去台湾参了个会,就听说自由行受限了 会上碰到了主办方的老板霍泰稳,聊了一会儿以后,他就邀请我做一门和产品 ...

最新文章

  1. redisson get()数据报错,missing type id property ‘@class’
  2. 一块GPU就能训练语义分割网络,百度PaddlePaddle是如何优化的?
  3. hust1347(归并排序求逆序对)
  4. SAP Spartacus项目执行yarn prettier-fix命令之后的输出
  5. 番茄日志发布1.0.3版本-增加Kafka支持
  6. Java中父类的静态变量和静态方法的继承问题
  7. Linux系统:centos7下安装Jdk8、Tomcat8、MySQL5.7环境
  8. 通过配置hosts.allow和hosts.deny文件允许或禁止ssh或telnet操作
  9. Python学习(六)模块
  10. (转)Uncaught TypeError: Cannot set property 'innerHTML' of null
  11. 【原】iOS触摸事件深度解析
  12. 在chrome上安装印象笔记插件
  13. 锂电池技术关键突破:水淹火烧重击短路都不炸!三星看了会沉默,特斯拉蔚来听了要流泪...
  14. 批处理从入门到精通_DOS/BAT
  15. processing图片粒子化_谈谈文字图片粒子化
  16. 知识产权服务代理行业税收政策
  17. 墨刀实现区域内滚动效果
  18. mysql分组取最新时间的数据
  19. Hedge fund Two Sigma hires Alfred Spector as Chief Technology Officer
  20. 全国大学生软件测试大赛Web应用大赛常用测试语句

热门文章

  1. php站群框架,[文化传媒]TP-Admin 大型CMS站群级后台管理系统 (开源) - 行业交流 - 极思维...
  2. react学习—ref
  3. 编写代码的软件用什么编写的_当编写过多的代码可能会杀死您
  4. 人工智能技术大爆发,离改变世界到底还有多远?【智库2861】
  5. etl工具linux安装,Centos7下ETL工具之kettle安装
  6. 谁执行了我的main函数
  7. Oracle函数介绍:decode
  8. 人脸检测、人脸跟踪、人脸识别、OpenCV(特征脸、LBPH、费歇脸)
  9. Azure安装AKS步骤及注意事项
  10. 计算机软件音乐与游戏电子报纸,燃气红外辐射器的安装高度应根据人体舒适度确定,但不应低于()。A.2mB.3mC.3.5mD.4m...