你好,欢迎来到你问人生何的博客园啊

算法 -数组-买股票的最佳日子

 

给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。

你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。

返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。

 

示例 1:

输入:[7,1,5,3,6,4]
输出:5
解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。

 

最开始的暴力解法

先确定第一个数 遍历一轮 再确定第二个数遍历 前一个数减去后一个数的结果与0去作比较 然后随着循环比较出最大的那个值 得到结果

暴力解法不愧是暴力解法 直接可能leetcode报时间过长 失败🤣


public class Solution {

    public int maxProfit(int[] prices) {
        int len = prices.length;
        if (len < 2) {
            return 0;
        }

        // 有可能不发生交易,因此结果集的初始值设置为 0
        int res = 0;

        // 枚举所有发生一次交易的股价差
        for (int i = 0; i < len - 1; i++) {
            for (int j = i + 1; j < len; j++) {
                res = Math.max(res, prices[j] - prices[i]);
            }
        }
        return res;
    }
}

第二个解决方法 让我为之一绝的贪心法

贪心法

 因为股票就买卖一次, 那么贪心的想法很自然就是取最左最小值, 取最右最大值, 那么得到的差值就是最大利润.

这里要注意 最左最小值: 它是指当前天 之前的最小值, 相当于局部最小值, 并不是全局最小值, 官方题解中称为 历史最低点, 其实都是表达的同一个意思

public class Solution {
    public int maxProfit(int[] prices) {
        int low = Integer.MAX_VALUE;
        int result = 0;//定义最后输出的结果 可能为0
        for (int i = 0; i < prices.length; i++) {

            low = Math.min(low, prices[i]);//找出左边最小的那个数字
            result = Math.max(result, prices[i] - low);//右边的是后面几天股票的价格 减去前面几天的最小值就是我们的最大利润 再让他与自己比较
        }//其中也可能出现后面的股票卖出比买入一样 输出0
        return result;

    }
}

 

其实最普遍的解法是第三种动态规划 暂时还没理解和吸收等以后回来完善 加油😶

 

posted @   你问人生何  阅读(47)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义

本站勉强运行 1953 天 17 小时 32 分 25 秒

点击右上角即可分享
微信分享提示