【力扣】【初级算法】买股票的最佳时机

买股票的最佳时机||

1.题目要求

给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。

在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。

返回 你能获得的 最大 利润 。

作者:力扣 (LeetCode)
链接:https://leetcode.cn/leetbook/read/top-interview-questions-easy/x2zsx1/
来源:力扣(LeetCode)

*理解与题解:

贪心算法

不用陷入第二天股价未知的误区。只需要找到股票上涨的最大值和股票开始上涨的最小值,计算他们的差就是这段时间内股票的最大利润
例如【1,2,3,4,5】
①第一天买入第二天卖出赚2-1=1,第二天买入第三天卖出3-2=1,第三天买入第四天卖出4-3=1,第四天买入第五天卖出5-4=1,共赚4;
②第一天买入,第五天卖出5-1=4.
结果相同过程不同。
例如【7,1,5,3,6,4】
①第一天买入第二天卖出是负的不计入(第一天不买),第二天买入第三天卖出5-1=4,第三天买入第四天卖出3-5为负(第三天不买)四买五卖6-3=3,五买六卖负的(不买入)4+3=7,赚7.
java:

class Solution {
    public int maxProfit(int[] prices) {
        // java贪心算法
        int n = prices.length;
        int ans = 0;
        for(int i=1;i<n;i++){
            ans+=Math.max(0,prices[i]-prices[i-1]);
        }
        return ans;

    }
}

python:

class Solution(object):
    def maxProfit(self, prices):
        """
        python 贪心算法
        :type prices: List[int]
        :rtype: int
        """
        ans = 0
        for i in range(1,len(prices)):
            ans+=max(0,prices[i]-prices[i-1])
        return ans

动态规划

1.定义状态
用二维数组表示,第一维表示第i天,第二维表示这一天手里有没有股票(0表示没有,1表示有)。
dp[i][0]表示第i天手里没有股票。
dp[i][1]表示第i天手里有股票
2.初始条件
第一天不买则手里没有股票,初始就是dp[0][0]=0;
第一天买入则需要花掉第一天的股价:dp[0][1] = -prices[0]
3.状态转移
如果这一天手里没有股票:则只有两种可能①前一天也没有股票,今天也没有买入dp[i-1][0];②前一天有股票,今天卖出去了dp[i-1][1]+prices[i]

dp[i][0] = Math.max(dp[i-1][0],dp[i-1][1]+prices[i]);

如果这一天手里有股票:两种可能:①昨天手里就有(今天也没有卖)②今天买入

dp[i][1] = Math.max(dp[i-1][1],dp[i-1][0]-prices[i]);

注:两个状态没有先后顺序。
4.返回值
由于交易结束后,手里有股票的收益 < 手里没有股票的,
所以返回没有股票的dp[n-1][0];
java

class Solution {
    public int maxProfit(int[] prices) {
    //java
        int n = prices.length;
        //初始条件
        int dp[][] = new int[n][2];
        //第二个0表示手里没有股票 1表示有股票
        dp[0][0] = 0;
        dp[0][1] = -prices[0];
        for(int i=1; i<n; i++){
            dp[i][0]=Math.max(dp[i-1][1]+prices[i],dp[i-1][0]);
            dp[i][1]=Math.max(dp[i-1][0]-prices[i],dp[i-1][1]);                
} 
        return dp[n-1][0];
    }
}

python

class Solution(object):
    def maxProfit(self, prices):
        """
        :type prices: List[int]
        :rtype: int
        """
        n = len(prices)
        dp = [[0]*2 for _ in range(n)]
        dp[0][0]= 0
        dp[0][1]=-prices[0]
        for i in range(1,n):
            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]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值