算法 -数组-买股票的最佳日子
给定一个数组 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;
}
}
其实最普遍的解法是第三种动态规划 暂时还没理解和吸收等以后回来完善 加油😶
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .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 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义