首页 > 编程语言 >代码随想录算法训练营第四十天|Day40 动态规划

代码随想录算法训练营第四十天|Day40 动态规划

时间:2024-11-08 13:46:15浏览次数:3  
标签:int max 训练营 pricesSize 随想录 E6% prices dp Day40

121. 买卖股票的最佳时机

视频讲解:https://www.bilibili.com/video/BV1Xe4y1u77q

https://programmercarl.com/0121.%E4%B9%B0%E5%8D%96%E8%82%A1%E7%A5%A8%E7%9A%84%E6%9C%80%E4%BD%B3%E6%97%B6%E6%9C%BA.html

思路

#define max(a, b) ((a) > (b) ? (a) : (b))
#define min(a, b) ((a) > (b) ? (b) : (a))
int maxProfit(int* prices, int pricesSize) {
    int low = INT_MIN;
    int result = 0;
    for(int i = 0; i < pricesSize; i++){
        low = min(low, prices[i]);
        result = max(result, prices[i] - low);
    }
    return result;
}

学习反思

通过定义宏max和min来实现获取两个数中的最大值和最小值。宏的使用可以简化代码,提高可读性。然后,在函数内部定义了两个变量low和result,分别用来存储最低价格和最大收益。接下来,通过循环遍历prices数组,更新low和result的值。首先使用宏min来更新low,将当前价格和low比较取较小值。然后使用宏max来更新result,将当前价格减去low的差值与当前result比较取较大值。最后,返回result作为最大收益。

122.买卖股票的最佳时机II

视频讲解:https://www.bilibili.com/video/BV1D24y1Q7Ls

https://programmercarl.com/0122.%E4%B9%B0%E5%8D%96%E8%82%A1%E7%A5%A8%E7%9A%84%E6%9C%80%E4%BD%B3%E6%97%B6%E6%9C%BAII%EF%BC%88%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92%EF%BC%89.html

思路

#define max(a, b) ((a) > (b) ? (a) : (b))
int maxProfit(int* prices, int pricesSize){
    int **dp = malloc(sizeof (int *) * pricesSize);
    for (int i = 0; i < pricesSize; ++i) {
        dp[i] = malloc(sizeof (int ) * 2);
    }
    dp[0][0] = -prices[0];
    dp[0][1] = 0;
    for (int i = 1; i < pricesSize; ++i) {
        dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i]);
        dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i]);
    }
    return dp[pricesSize - 1][1];
}

学习反思

使用了一个二维数组dp来记录每天持有或不持有股票时的最大收益。dp[i][0]表示第i天持有股票时的最大收益,dp[i][1]表示第i天不持有股票时的最大收益。首先,初始化dp数组的第一行,即第0天的情况。dp[0][0]表示第0天持有股票时的最大收益,由于要买入股票,所以收益为-prices[0]。dp[0][1]表示第0天不持有股票时的最大收益,由于没有买入股票,所以收益为0。然后,从第1天开始遍历每一天,更新dp数组。对于第i天持有股票的最大收益,有两种情况:要么是前一天持有股票的最大收益dp[i-1][0],要么是前一天不持有股票的最大收益减去当天股票价格prices[i]。取其中的较大值更新dp[i][0]。对于第i天不持有股票的最大收益,也有两种情况:要么是前一天不持有股票的最大收益dp[i-1][1],要么是前一天持有股票的最大收益加上当天股票价格prices[i]。取其中的较大值更新dp[i][1]。最后,返回dp数组的最后一行的第一个元素dp[pricesSize-1][1],即最后一天不持有股票的最大收益,也就是问题要求的最大收益。这段代码的时间复杂度为O(n)。

123.买卖股票的最佳时机III

视频讲解:https://www.bilibili.com/video/BV1WG411K7AR

https://programmercarl.com/0123.%E4%B9%B0%E5%8D%96%E8%82%A1%E7%A5%A8%E7%9A%84%E6%9C%80%E4%BD%B3%E6%97%B6%E6%9C%BAIII.html

思路

#define max(a, b) ((a) > (b) ? (a) : (b))
#define min(a, b) ((a) > (b) ? (b) : (a))
int maxProfit(int* prices, int pricesSize) {
    int buy1 = prices[0], buy2 = prices[0];
    int profit1 = 0, profit2 = 0;
    for (int i = 0; i < pricesSize; ++i) {
        buy1 = min(buy1, prices[i]);
        profit1 = max(profit1, prices[i] - buy1);
        buy2 = min(buy2, prices[i] - profit1);
        profit2 = max(profit2, prices[i] - buy2);
    }
    return profit2;
}

学习反思

来计算股票的最大利润。代码中定义了两个宏:max和min,用来求两个值的较大值和较小值。然后定义了四个变量:buy1、buy2、profit1和profit2,分别表示第一次购买的价格、第二次购买的价格、第一次交易的利润和第二次交易的利润。接下来使用循环遍历股票价格数组。在每次循环中,分别更新buy1和profit1。buy1取当前价格和buy1的较小值,表示第一次购买的最低价格。profit1取当前价格减去buy1和profit1的较大值,表示第一次交易的最大利润。然后更新buy2和profit2。buy2取当前价格减去profit1和buy2的较小值,表示第二次购买的最低价格。profit2取当前价格减去buy2和profit2的较大值,表示第二次交易的最大利润。最后返回profit2,即为最大利润。该算法的时间复杂度是O(n)。

总结

加油!!!!

标签:int,max,训练营,pricesSize,随想录,E6%,prices,dp,Day40
From: https://blog.csdn.net/a6666999d/article/details/143624519

相关文章

  • 代码随想录算法训练营第二十天|leetcode235. 二叉搜索树的最近公共祖先、leetcode701.
    1leetcode235.二叉搜索树的最近公共祖先题目链接:235.二叉搜索树的最近公共祖先-力扣(LeetCode)文章链接:代码随想录视频链接:二叉搜索树找祖先就有点不一样了!|235.二叉搜索树的最近公共祖先_哔哩哔哩_bilibili思路:用之前一样的方法,哈哈哈哈哈,好处就是做出来了,但是我觉得需......
  • 代码随想录算法训练营第九天|LeetCode151.翻转字符串里的单词、卡码网:55.右旋转字符串
    前言打卡代码随想录算法训练营第49期第九天︿( ̄︶ ̄)︿首先十分推荐学算法的同学可以先了解一下代码随想录,可以在B站卡哥B站账号、代码随想录官方网站代码随想录了解,卡哥清晰易懂的算法教学让我直接果断关注,也十分有缘和第49期的训练营大家庭一起进步。今日题目LeetCode151翻转字......
  • 代码随想录算法训练营 day37 day38| 卡码网52.完全背包 518. 零钱兑换 II 377.
    学习资料:https://programmercarl.com/背包问题理论基础完全背包.html#算法公开课相比于01背包,完全背包中每个物品都可以无限次的放入组合:先遍历物品,再逆序遍历背包排列:先逆序遍历背包,再遍历物品学习记录卡码网52.携带研究资料(dp[i]代表当重量为i时的最大价值)点击查看代码n......
  • 代码随想录一刷day7 哈希表day1
    遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。但是哈希法也是牺牲了空间换取了时间,因为我们要使用额外的数组,set或者是map来存放数据,才能实现快速的查找。常见三种实现哈希表的数据结构:数组set集合map映射下面是setmap的红黑树是一种平衡二叉搜索树,所以k......
  • 代码随想录第七天|哈希表part02--454.四数相加II、383. 赎金信、15. 三数之和、18. 四
    资源引用:leetcode题目:454.四数相加Ⅱ(454.四数相加II-力扣(LeetCode))383.赎金信(383.赎金信-力扣(LeetCode))15.三数之和(15.三数之和-力扣(LeetCode))18.四数之和(18.四数之和-力扣(LeetCode))例行碎碎念:今天也追赶上了一些进度,虽然生病感冒,但今天很好的坚持了从早到晚......
  • 代码随想录算法训练营第十八天|leetcode530.二叉搜索树的最小绝对差、leetcode501.二
    1leetcode530.二叉搜索树的最小绝对差题目链接:530.二叉搜索树的最小绝对差-力扣(LeetCode)文章链接:代码随想录视频链接:你对二叉搜索树了解的还不够!|LeetCode:98.验证二叉搜索树_哔哩哔哩_bilibili思路:定义一个极大值作为结果,然后在中序遍历过程中进行比较出结果1.1自己的......
  • 代码随想录打卡Day14
    1.力扣226:翻转二叉树题目描述:给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。示例1:输入:root=[4,2,7,1,3,6,9]输出:[4,7,2,9,6,3,1]示例2:输入:root=[2,1,3]输出:[2,3,1]示例3:输入:root=[]输出:[]解答代码:/***Definitionforabin......
  • 代码随想录打卡Day18
    1.二叉搜索树的最小绝对差:题目描述给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 。差值是一个正数,其数值等于两值之差的绝对值。示例1:输入:root=[4,2,6,1,3]输出:1代码:/***Definitionforabinarytreenode.*structTree......
  • 代码随想录打卡Day17
    1.力扣954:最大二叉树:题目描述:给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建:创建一个根节点,其值为 nums 中的最大值。递归地在最大值 左边 的 子数组前缀上 构建左子树。递归地在最大值 右边 的 子数组后缀上 构建右......
  • 代码随想录打卡Day16
    1.力扣531:找树左下角的值。题目描述:给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。假设二叉树中至少有一个节点。示例1:输入:root=[2,1,3]输出:1示例2:输入:[1,2,3,4,null,5,6,null,null,7]输出:7解答代码:/***Defi......