Buy and sell stock at best time(i,ii,iii)

本文详细解析了三种不同约束条件下的股票交易策略算法实现:单次交易、无限次交易及限定两次交易的情况,并提供了具体的Java代码实现。

题意:
i:交易一次,求买入卖出得到的最大利润。
ii:交易无限次,但不能在同一时间进行多次交易。
iii:交易二次,求买入卖出得到的最大利润。
思路:
i:只须找出价格序列中的最大最小值。低进高出,最低的一天要在最高的一天之前,贪心解决。
代码:

public int ProfitMax(int[] prices){
        if(prices == null || prices.length < 1) return prices[0];
        int profit = 0;
        int cur_min = prices[0];
        for(int i = 0 ; i < prices.length ; i++){
            profit = Math.max(profit, prices[i]-cur_min);
            cur_min = Math.min(cur_min, prices[i]);
        }
        return profit;
    }

ii:只要交易的差值为正,就加入交易总金额中。

public int ProfitMax(int[] prices){
        if(prices == null || prices.length<1 ) return prices[0];
        int sum = 0;
        for (int i = 1; i < prices.length; i++) {
            int diff = prices[i] - prices[i-1];
            if(diff > 0) sum += diff;
        }
        return sum;
    }

iii:动态规划解决。维护两个数组preProfits和postProfits,分别从前和从后面对价格进行利润值的计算。计算方式和i中的一样,最后把两者相加,得到最大值。
代码:

public int ProfitMax(int[] prices){
        if(prices == null || prices.length < 1) return prices[0];
        int[] preProfits = new int[prices.length+1];
        int[] postProfits = new int[prices.length+1];
        int cur_min = prices[0];
        for (int i = 1; i < prices.length; i++) {
            cur_min = Math.min(cur_min, prices[i]);
            preProfits[i] = Math.max(preProfits[i-1], prices[i]-cur_min);
        }
        for(int i = prices.length -2 , curMax = prices[prices.length-1]; i>= 0 ;i-- ){
            curMax= Math.max(curMax, prices[i]);
            postProfits[i] = Math.max(postProfits[i], curMax-prices[i]);
        }
        int max_profit = 0;
        for (int i = 0; i < prices.length; i++) {
            max_profit = Math.max(max_profit, preProfits[i]+postProfits[i]);
        }
        return max_profit;
        }
最佳的时间买卖股票III问题也可以使用动态规划算法来解决。动态规划算法通过将问题拆分为子问题,并利用子问题的解来构建更大规模问题的解。 对于最佳的时间买卖股票III问题,我们可以使用动态规划来构建一个二维数组dp,其中dp[i][j]表示在第i天结束时,最多进行j次交易所能获得的最大利润。 我们可以使用两个状态数组buysell来表示第j次交易的买入和卖出价格。初始化buysell数组为负无穷大。 接下来,我们遍历股票价格列表,对于每一天的价格,我们更新buysell数组的值。具体更新方式如下: 1. 对于第j次交易的买入价格,我们可以选择继续保持之前的买入价格(buy[j])或者在第i天买入(prices[i] - dp[i-1][j-1])。 2. 对于第j次交易的卖出价格,我们可以选择继续保持之前的卖出价格(sell[j])或者在第i天卖出(prices[i] + buy[j])。 在更新完buysell数组后,我们更新dp[i][j]为当前的最大利润(即sell[j])。 最后,我们返回dp[-1][-1]作为最大利润。 下面是使用动态规划算法解决最佳的时间买卖股票III问题的代码示例(假设prices是股票价格的列表): ```python def maxProfit(prices): n = len(prices) k = 2 # 最多进行两次交易 dp = [[0] * (k+1) for _ in range(n)] buy = [-float('inf')] * (k+1) sell = [0] * (k+1) for i in range(n): for j in range(1, k+1): buy[j] = max(buy[j], dp[i-1][j-1] - prices[i]) sell[j] = max(sell[j], prices[i] + buy[j]) dp[i][j] = max(dp[i-1][j], sell[j]) return dp[-1][-1] ``` 这个算法的时间复杂度是O(nk),其中n是股票价格列表的长度,k是最多进行的交易次数。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值