动态规划【简单】买股票的最佳时机

“当你越来越专注自身的时候,不断精进,你就会变得越来越清醒,整个人的气运,会进入一个排毒状态,在长达一两年的时间内,你会攀援到一个新的台阶,会和很多人告别,会刹那间想通很多的事情。”

给定一个数组prices,它的第i个元素prices[i]表示一支给定股票第i天的价格。
你只能选择某一天买入这只股票,并选择在未来的某一天不同的日子卖出该股票。设计一个算法来计算你所能获取的最大利润。

d1买入 d1回收 d2回收 d3回收 d4回收 总共n

1 / -6 -2 -4 -1 -3
2 / / 4 2 5 3
3 / / / -2 1 -1
4 / / / / 3 1
5 / / / / -2
6 / / / / /

可以通过一个max来存储最大值(初始为0),这样都最后便可以直接取到结果了。

代码:

class Solution {
    public int maxProfit(int[] prices) {
        int length = prices.length;
       // int[][] dp = new int[length][length];
        int max = 0;
        for(int i = 0; i < length; i++){
        if(prices[i] > price[i+1] && i < length - 2){
        continue;
        }
            for(int j = i + 1; j < length; j++){
                if(prices[j] - prices[i] > max){
                    max = prices[j] - prices[i];
                }
            }
        }
        return max;
    }
}

运行后发现超出内存,考虑优化。其实在上述代码中我们完全未使用到dp,直接删掉即可。

再次运行发现又超出时间限制(双重循环)。考虑双指针实现发现不靠谱,思考后是dp方式有问题,双重循环的开销太大了,可以在一次循环中不断记录到目前为止可以用的最大利润。则dp数组大小以及时间复杂度由n^2变为2n。

d1买入 maxTotalProfit minDayProfit
1 0 7
2 0 1
3 4 1
4 4 1
5 5 1
6 5 1


```java
代码:
class Solution {
    public int maxProfit(int[] prices) {
        int length = prices.length;
        int maxP = 0;
        int min = prices[0];
        int[][] dp = new int[length][2];

        dp[0][0] = maxP;
        dp[0][1] = min;
        for(int i = 1; i < length; i++){
            dp[i][0] = Math.max(prices[i] - dp[i - 1][1], dp[i - 1][0]);
            dp[i][1] = Math.min(dp[i - 1][1], prices[i]);
        }
        return dp[length - 1][0];
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值