ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【LeetCode】买卖股票

2021-10-29 20:30:00  阅读:198  来源: 互联网

标签:买卖 int 股票 ans Math max prices LeetCode dp


问题1:假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?
题目链接:剑指 Offer 63. 股票的最大利润
贪心:强调只买卖一次,因此只需要记录一个当前的最小值即可,每遍历一个数都算一遍答案。

代码:

class Solution {
    public int maxProfit(int[] prices) {
        if(prices.length<2) return 0;
        int minNum=prices[0];
        int ans=0;
        for(int i=1;i<prices.length;i++){
            minNum=Math.min(prices[i],minNum);
            ans=Math.max(prices[i]-minNum,ans);
        }
        return ans;
    }
}

问题进阶:给定一个数组 prices ,其中 prices[i] 是一支给定股票第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。

注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

题目链接:122. 买卖股票的最佳时机 II

思路:遍历一遍,只要后面比前面高就卖。
代码:

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

题目链接:309. 最佳买卖股票时机含冷冻期
给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 。​

设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):

  • 你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
  • 卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。

思路:
动态规划,用dp[i][j]表示第i天的收入情况。第二维表示买入、卖出和冷冻分别对应0,1,2.
在这里插入图片描述

那么对应的状态转移为:

dp[i][0]=Math.max(dp[i-1][0],dp[i-1][2]-prices[i]); dp[i-1][2]-prices[i]表示从冷冻期买入
dp[i][1]=dp[i-1][0]+prices[i];
dp[i][2]=Math.max(dp[i-1][2],dp[i-1][1]);

代码1:

class Solution {
    public int maxProfit(int[] prices) {
        int n=prices.length;
        if(n<2) return 0;
        int dp[][]=new int[n+1][3];
        dp[0][0]=-prices[0];  //刚开始为负收益,买入就减,卖出就加
        for(int i=1;i<n;i++){
            dp[i][0]=Math.max(dp[i-1][0],dp[i-1][2]-prices[i]);
            dp[i][1]=dp[i-1][0]+prices[i];
            dp[i][2]=Math.max(dp[i-1][2],dp[i-1][1]);
        }
        return Math.max(dp[n-1][1],dp[n-1][2]);
    }
}

代码2:

class Solution {
    public int maxProfit(int[] prices) {
        // 动态规划,加一维表示0买入还是1卖出
        //dp[i][x]表示第i-1天买入还是卖出的最大收益
        int n=prices.length;
        if(n<2) return 0;
        int dp[][]=new int[n+1][2];
        dp[0][0]=-prices[0];
        dp[0][1]=0;
        dp[1][0]=-prices[0];
        dp[1][1]=0;
        for(int i=2;i<=n;i++){
            dp[i][0]=Math.max(dp[i-1][0],dp[i-2][1]-prices[i-1]); //买入
            dp[i][1]=Math.max(dp[i-1][1],dp[i-1][0]+prices[i-1]); //卖出
        }
        return dp[n][1];
    }
}

标签:买卖,int,股票,ans,Math,max,prices,LeetCode,dp
来源: https://blog.csdn.net/dl962454/article/details/121036271

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有