其他分享
首页 > 其他分享> > 【LeetCode】买卖股票

【LeetCode】买卖股票

作者:互联网

问题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 天的股票价格 。​

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

思路:
动态规划,用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