一、题目
给定一个数组
prices
,它的第i
个元素prices[i]
表示一支给定股票第i
天的价格。你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回
0
。
二、思路
- 首先就想到暴力解法,因为是有顺序的题,买操作必在卖操作前;
- 故想到套双层循环,外层循环遍历每一天的价格,内层循环从当前天开始一直遍历到最后一天,总会找到最大收益,故有解法一;
- 然而想法很美好,直到力扣塞给我一个巨长的数组,但这时候还不甘心,想到能不能优化一下:都知道买股票要抄底,如果下一天的价格比今天还低,那肯定没到底,这样就能优化掉前面的一小截,同时卖股票要在高点卖,如果下一天的价格比今天还高,那肯定没到顶,于是有了解法一优化版,可惜还是超时;
- 回到抄底的思路上来,我如果维护一个 min 用来存储当前遇到的最小值,再维护一个 max ,在遍历时寻找此时与 min 差值最大的值,不就结了吗,故解法二;
三、解法
[超时]解法一
- 初版(超时)
class Solution {
public int maxProfit(int[] prices) {
int len = prices.length;
int profit = 0;
for (int i = 0; i < len; i++) {
for (int j = i; j < len; j++) {
profit = Math.max(profit, prices[j] - prices[i]);
}
}
return profit;
}
}
- 优化版 (仍超时)
class Solution {
public int maxProfit(int[] prices) {
int len = prices.length;
int profit = 0;
for (int i = 0; i < len; i++) {
if (i != len - 1 && prices[i] > prices[i + 1]) {
continue;
}
for (int j = i; j < len; j++) {
if (j != len - 1 && prices[j] < prices[j + 1]) {
continue;
}
profit = Math.max(profit, prices[j] - prices[i]);
}
}
return profit;
}
}
解法二
class Solution {
public int maxProfit(int[] prices) {
int len = prices.length;
int low = Integer.MAX_VALUE, max = Integer.MIN_VALUE;
for (int i = 0; i < len; i++) {
low = Math.min(low, prices[i]);
max = Math.max(max, prices[i] - low);
}
return max;
}
}