121. 买卖股票的最佳时机

动态规划

class Solution {
    public int maxProfit(int[] prices) {

        /**
         * 因为只能买一次,因此无法确定哪天买了还有每天的持股状态,需要定义一个二维数组分别存储持不持有该股票的利润
         * dp[i][0]为第i天持有该股票的利润
         * dp[i][1]为第i天不持有该股票的利润
         */
        int[][] dp = new int[prices.length][2];

        /**
         * 第一天如果持有,说明第一天买了,利润是负的
         * 第一天没买,利润是0
         */
        dp[0][0] = -prices[0];
        dp[0][1] = 0;

        /**
         * 对于第i天,如果持有,可能是前一天就持有了,或者是昨天没有今天买,二者取最大值(因为只能买一次,所以今天买的话本金肯定是0)
         * 如果不持有,可能是昨天就不持有了,或者是昨天有今天卖,二者取最大值
         */
        for (int i = 1; i < prices.length; i++) {

            dp[i][0] = Math.max(dp[i - 1][0], -prices[i]);
            dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][0] + prices[i]);
        }

        /**
         * 最后一天不持有,得到的就是最大利润
         */
        return dp[prices.length - 1][1];
    }
}

/**
 * 时间复杂度 O(n)
 * 空间复杂度 O(n)
 */

贪心

class Solution {
    public int maxProfit(int[] prices) {

        /**
         * 记录整个数组中的最小价格
         * 然后用所有的价格去减,得到最终的最大值
         */
        int minPrice = Integer.MAX_VALUE;
        int max = 0;
        
        for (int i = 0; i < prices.length; i++) {
            
            minPrice = Math.min(minPrice, prices[i]);
            max = Math.max(max, prices[i] - minPrice);
        }
        
        return max;
    }
}
/**
 * 时间复杂度 O(n)
 * 空间复杂度 O(1)
 */

https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/

上一篇:activiti 各个表和对应API


下一篇:卷积神经网络