力扣 买卖股票的最佳时机

贪心算法典型例题。

题目

做过股票交易的都知道,想获取最大利润,就得从最低点买入,最高点卖出。这题刚好可以用暴力,一个数组中找到最大的数跟最小的数,然后注意一下最小的数在最大的数前面即可。从一个数组中选两个数作比较,可以选用两个for循环。这题用dp同理,不过dp数组存状态是多余的。

时间复杂度: O(n^2),空间复杂度: O(1)。

java 复制代码
public class Solution {
    public int maxProfit(int[] prices) {
        int max = 0;
        for (int i = 0; i < prices.length - 1; i++) {
            for (int j = i + 1; j < prices.length; j++) {
                int profit = prices[j] - prices[i];
                if (profit > max) {
                    max = profit;
                }
            }
        }
        return max;
    }
}

不过超时了,可以优化一下,从前往后遍历,每遍历到一个数,即每去到一天时,去存最低价跟最大利润,因为最低价购入可以得到更大利润,最高价直接更新最大利润。

时间复杂度: O(n),空间复杂度: O(1)。

java 复制代码
public class Solution {
    public int maxProfit(int[] prices) {

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

贪心的策略是,每到一个数可存到一个局部最优解,而遍历完后做一次次更新去得到目标值。

相关推荐
喝养乐多长不高1 分钟前
数据结构--红黑树
java·数据结构·算法·红黑树·二叉搜索树·avl树
xindafu13 分钟前
代码随想录算法训练营第三十七天-2|动态规划part2
算法·动态规划
编程绿豆侠17 分钟前
力扣HOT100之链表:146. LRU 缓存
leetcode·链表·缓存
为美好的生活献上中指19 分钟前
面试问题总结(回忆版)
面试·职场和发展
এ᭄画画的北北1 小时前
力扣-142.环形链表II
算法·leetcode
朝九晚五ฺ1 小时前
【算法学习】递归、搜索与回溯算法(二)
数据结构·学习·算法·深度优先
短尾黑猫1 小时前
【LeetCode 42】接雨水(单调栈、DP、双指针)
算法·leetcode
月亮被咬碎成星星1 小时前
LeetCode[226] 翻转二叉树
算法·leetcode
KingQian20182 小时前
单片机嵌入式滤波算法库
单片机·嵌入式硬件·算法
瑞雪兆丰年兮2 小时前
数学实验(Matlab语言环境和线性代数实验)
算法·数学建模·matlab·数学实验