leetcode121 best time buy and sell stock

leetcode121 best time buy and sell stock

意思就是说在一组数字里,找到后出现的数减前面数的最大差值。

考虑两种情况:

1. 数组内的数不足两位或为空,则返回0

2. 数组内数大于2,就是我们要考虑的动态规划问题了

建立一个动态数组,用于存储0~下标天内的最大差值

一个临时数minprice记录0~i下标天内出现的最小数

class Solution {

    public int maxProfit(int[] prices) {
        if(prices == null || prices.length < 2)    return 0;
        int[] dp = new int[prices.length];
        int minprice = prices[0];
        for(int i = 1 ;  i < prices.length ; i++){
            minprice = (minprice<prices[i]) ? minprice : prices[i];
            dp[i] = Math.max(dp[i-1],prices[i]-minprice);
        }
        return dp[dp.length-1];
    }
}

有一种更省空间的写法,不使用动态数组存储最大收益了,直接使用一个int整数即可,不过这对时间复杂度没什么影响。。

class Solution {
    public int maxProfit(int[] prices) {
        if(prices == null || prices.length < 2)    return 0;
        // int[] dp = new int[prices.length];
        int maxprofit = 0;
        int minprice = prices[0];
        for(int i = 1 ;  i < prices.length ; i++){
            minprice = (minprice<prices[i]) ? minprice : prices[i];
            maxprofit = Math.max(maxprofit,prices[i]-minprice);
        }
        return maxprofit;
    }
}

 

试下来会发现每个动态规划的问题都可以用降一维的方法处理哦~一维转数字可能看不出来,但二维转一维就可以省很多空间了