首页 > 其他分享 >leetcode122买卖股票的最佳时机——贪心、动态规划

leetcode122买卖股票的最佳时机——贪心、动态规划

时间:2023-10-10 22:45:09浏览次数:32  
标签:own profit maxProfit leetcode122 最佳时机 prices 利润 day 贪心

题目描述:

 

给你一个整数数组 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 。

 

Solution:

 

1,贪心算法——每一步都求最优解

在这里比较好理解,我们“贪心”地在一旦有上升趋势的节点就买入股票,这样所有可能的利润都收入囊中。

c++

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        //贪心算法
        int n=prices.size();
        if(n<2) return 0;
        int lastday_prices=prices[0],today_prices=prices[1];
        int maxProfit=0;
        for(int i=1;i<n;i++) {
            today_prices=prices[i];
            if(today_prices>lastday_prices) maxProfit+=(today_prices-lastday_prices);
            lastday_prices=today_prices;
        }
        return maxProfit;
    }
};

Python:

此处介绍一个Python3函数 iertools.pairwise(object)

从对象里获得连续重叠对并返回

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
         if len(prices)<2:
            return 0 
         maxProfit=0
         for (lastday,today) in pairwise(prices):
             if (today-lastday)>0:
                maxProfit+=(today-lastday)
         return maxProfit

 

2.动态规划

动态规划常用于给定问题可以查分成子问题,并且原问题解要用到子问题解

这里的子问题就是每一天的最大利润

设二维数组profit[if_own][day] ,if_own指当前是否拥有股票,day指这是第几天,profit[][]的值表示当前状态的最大利润

profit[own][day]=max( profit [not_own] [day-1] - price [today] , profit [own] [day-1] )

profit[notown][]day = max ( profit [not_own] [day-1] , profit [own ] [day-1] + prices[day]  )

c++

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        if(prices.size()<2) return 0;
        int lastday_own=-prices[0],lastday=0;
        int n=prices.size();
        for(int i=1;i<n;i++) {
            int today_own=max(lastday_own,lastday-prices[i]);
            int today=max(lastday,lastday_own+prices[i]);
            lastday=today;
            lastday_own=today_own;
        }
        return lastday;
    }
};

 

标签:own,profit,maxProfit,leetcode122,最佳时机,prices,利润,day,贪心
From: https://www.cnblogs.com/ricenoodle/p/17755945.html

相关文章

  • 反悔贪心
    前置知识:堆。反悔贪心,顾名思义,就是在朴素贪心的基础上加上【反悔】操作,做增量更新,以修正答案。反悔贪心的模板操作可以看前三道例题。例题题目备注P2949[USACO09OPEN]WorkSchedulingG存在非反悔贪心解法,本身也很板子,可以想一想iai617生存游戏同P2949CF......
  • 专题1——贪心
    P9209考虑一个贪心,首先一定总是只有一段连续段。所以答案就是这个样子了。\[\sumw_i+(n-i)\max(l_i,r_i)\]CF1661D从右往左扫一遍,要加就加最牛逼的。维护问题的二阶差分即可。P9378哦宇宙射线!贪心一下,每次让最脆弱的被轰掉。AT_abc254_h问题是相对的,然后考虑优先队列......
  • 状态机DP,力扣188. 买卖股票的最佳时机 IV
    状态机DP,力扣188.买卖股票的最佳时机IV整数数组prices和一个整数k,其中prices[i]是某支给定的股票在第i天的价格。一次只能参与一笔交易,最多可以进行k笔交易,求最大利润。确定状态f[n+1][k+2][2],f[i][j][0]、f[i][j][1]分别表示前i天最多进行j次交易,且在第i天时......
  • 贪心
    这玩意真的很烦,贪心题不分难度我都想不出来……也许是写的题太少了……2023.9.27P1367蚂蚁先不要管蚂蚁的编号,也就是把所有蚂蚁看成无差别的。贪心里面貌似非常喜欢无差别这个性质:因为无差别,所以A,B相遇之后掉头,其实相当于继续往前走(而且方向不变),因为蚂蚁们没有区别。然后......
  • 力扣-买卖股票的最佳时机(含冷冻期)
    1.问题给定一个整数数组,其中第i个元素代表了第i天的股票价格。设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。卖出股票后,你无法在第二天买入股票(即冷冻......
  • 【POJ 3253】Fence Repair 题解(贪心算法+优先队列+哈夫曼树)
    农夫约翰想修理牧场周围的一小段围栏。他测量了围栏,发现他需要N(1≤N≤20000)块木板,每块木板都有一定的整数长度Li(1≤Li≤50000)单位。然后,他购买了一块长度刚好足以锯入N块木板的长木板(即,其长度为Li长度的总和)。FJ忽略了“切口”,即锯切时锯屑损失的额外长度;你也应该忽略它。FJ伤心地......
  • 【POJ 1521】Entropy 题解(贪心算法+优先队列+哈夫曼树)
    熵编码器是一种数据编码方法,通过对删除了“浪费”或“额外”信息的消息进行编码来实现无损数据压缩。换句话说,熵编码去除了最初不需要的信息,以准确编码消息。高度的熵意味着一条消息包含大量浪费的信息;以ASCII编码的英文文本是具有极高熵的消息类型的示例。已经压缩的消息,如JPEG图......
  • 【枚举】【贪心技巧】【集训队互测2021】子集匹配
    题目描述给定\(n,k(2k\geqn)\),二进制中有\(k\)个\(1\)的不超过\(n\)位的数有\(\binom{n}{k}\)个,有\(k-1\)个\(1\)的有\(\binomn{k-1}\)个,后者显然大于等于前者,要求对于每一个\(k\)个\(1\)的数\(x\),都找出一个\(k-1\)位的数\(y\)与之对应,且\(x......
  • 代码随想录算法训练营-贪心算法-5|56. 合并区间、738. 单调递增的数字、968. 监控二叉
    56. 合并区间时间复杂度:O(nlogn)空间复杂度:O(logn),排序需要的空间开销1classSolution:2defmerge(self,intervals):3result=[]4iflen(intervals)==0:5returnresult#区间集合为空直接返回67int......
  • 代码随想录算法训练营-贪心算法-4|406. 根据身高重建队列、452. 用最少数量的箭引爆
    406. 根据身高重建队列1. 一定要想如何确定一个维度,然后再按照另一个维度重新排列。2.先确定身高的维度,降序排列。3. 按照身高排序之后,优先按身高高的people的k来插入,后序插入节点也不会影响前面已经插入的节点,最终按照k的规则完成了队列。4. 局部最优:优先按身高高的peop......