首页 > 其他分享 >122.买股票的最佳时机II

122.买股票的最佳时机II

时间:2024-09-02 12:22:47浏览次数:5  
标签:dp0 int max II 122 最佳时机 prices dp 利润

122.买股票的最佳时机II

给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。
在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。
返回 你能获得的 最大 利润 。

示例 1:
输入:prices = [7,1,5,3,6,4]
输出:7
解释:在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4。
随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6 - 3 = 3。
最大总利润为 4 + 3 = 7 。

示例 2:
输入:prices = [1,2,3,4,5]
输出:4
解释:在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4。
最大总利润为 4 。

示例 3:
输入:prices = [7,6,4,3,1]
输出:0
解释:在这种情况下, 交易无法获得正利润,所以不参与交易可以获得最大利润,最大利润为 0。

提示:
1 <= prices.length <= 3 * 104
0 <= prices[i] <= 104
代码一
只要股票呈现上升趋势,每天的累加差值即可,也就是求数组的差分数组

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int n=prices.size();
        int res=0;
        for(int i=1;i<n;i++){
            if(prices[i]>prices[i-1]){
                res+=prices[i]-prices[i-1];
            }
        }
        return res;
    }
};

代码二
用动态规划去做
①状态表示
定义状态 dp[i][0] 表示第 i 天交易完后手里没有股票的最大利润,dp[i][1] 表示第 i 天交易完后手里持有一支股票的最大利润(i 从 0 开始)。
操作,求max
②状态计算
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]}
③初始状态
dp[0][0]=0,dp[0][1]=−prices[0]

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int n = prices.size();
        int dp[n][2];
        dp[0][0] = 0, dp[0][1] = -prices[0];
        for (int i = 1; i < n; ++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[n - 1][0];
    }
};

代码三
优化上面的步骤,每次的状态仅仅和上一次的状态有关,把二维变成一维,但感觉本质和代码二、代码一没啥区别,倒是像两者的中间一种求解方法,思路位于两者中间

class Solution {    
public:    
    int maxProfit(vector<int>& prices) {    
        int n = prices.size();    
        int dp0 = 0, dp1 = -prices[0];    
        for (int i = 1; i < n; i++) {    
            int newDp0 = max(dp0, dp1 + prices[i]);    
            int newDp1 = max(dp1, dp0 - prices[i]);    
            dp0 = newDp0;    
            dp1 = newDp1;    
        }
        return dp0;    
    }
};

标签:dp0,int,max,II,122,最佳时机,prices,dp,利润
From: https://blog.csdn.net/weixin_46006714/article/details/141810810

相关文章

  • 代码随想录day48 || 739, 每日温度 496, 下一个更大元素 I 503, 下一个更大元素II
    739每日温度funcdailyTemperatures(temperatures[]int)[]int{ //双指针 varres=make([]int,len(temperatures)) fori:=0;i<len(temperatures);i++{ forj:=i+1;j<len(temperatures);j++{ iftemperatures[j]>temperatures[i]{ res[i]=j......
  • 设置IIS支持ashx
    打开【处理程序映射】默认界面如下(是不支持处理ashx的):如果需要设置能处理ashx,需要开启ASP.NET4.8再打开【处理程序映射】,如下: ......
  • 题解:洛谷 P10878 [JRKSJ R9] 在相思树下 III
    原题链接解析在操作一时,最小值如果在最后一位,其无法更新任何数,会被删除;否则不在最后一位时一定会被其右侧更大的数更新。所以在操作一时,最小值一定会被更新掉。同理,在操作二时,最大值一定会被更新掉。由此,操作一决定了答案的下限,操作二决定了答案的上限。所以可以得出贪心策略......
  • 63. 不同路径 II(leetcode)
    简单dphttps://leetcode.cn/problems/unique-paths-ii/description/传统做法:classSolution{public:intuniquePathsWithObstacles(vector<vector<int>>&obstacleGrid){intf[110]={0};//优化一维f[1]=1;intm=obstacleGrid......
  • NC 二分查找-II
    系列文章目录文章目录系列文章目录前言前言前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。描述请实现有重复数字的升序数组的二分查找给定一个元素有序的(升序)长......
  • Java毕设项目II基于Java的工厂车间管理系统设计与实现
    目录一、前言二、技术介绍三、系统实现四、论文参考五、核心代码六、源码获取全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末一、前言随着工业4.0时代的到来,车间管理的智能化......
  • 代码随想录算法训练营,8月31日 | 24. 两两交换链表中的节点,19.删除链表的倒数第N个节点
    24.两两交换链表中的节点题目链接:24.两两交换链表中的节点文档讲解︰代码随想录(programmercarl.com)视频讲解︰两两交换链表中的节点日期:2024-08-31做前思路:用上虚拟头指针,从头开始,先指向2再到1,再到3,但要注意保留原本的结点。Java代码如下:classSolution{publicListN......
  • leetcode刷题day4|链表部分(24. 两两交换链表中的节点 、19.删除链表的倒数第N个节点、
    前言:链表练习的第二天,对链表的理解加深了24.两两交换链表中的节点这个题一开始的思路是用cur和next两个指针来做,但是绕来绕去绕迷糊了,最后超时了。把错误的代码放在下面警醒大家:主要问题出现在这两行代码,next.next发生了更改。next.next=next.next.next;next.next.nex......
  • 【dp力扣】买卖股票的最佳时机III
    目录审题通过动态规划固定套路思考:1、定义状态表示(关键)2、推导状态转移方程(重点)对于buy(可买入股票):回顾状态表示:第一种情况:第二种情况:联立两种情况(取两种情况的最大值):​对于own(持有股票)回顾状态表示:第一种情况:第二种情况:(最终结果)联立两种情况(还是取max):3、初......
  • (算法)基本计算器II————<栈—模拟>
    1.题⽬链接:227.基本计算器II2.题⽬描述:题⽬解析:⼀定要认真看题⽬的提⽰,从提⽰中我们可以看到这道题:•只有「加减乘除」四个运算;•没有括号;•并且每⼀个数都是⼤于等于0的;这样可以⼤⼤的「减少」我们需要处理的情况。 3.解法(栈):算法思路:由于表达式⾥⾯没......