买卖股票的最佳时机:
题目:
给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。
思路:
给定一个数组表示每天的股票交易价格,然后输出一次能获得的最大利润。
利润其实就是卖出价格减去买入价格,那么转换下就是最好是股价最低的时候买入,最高的时候卖出。 不过这还有个时序问题,就是组稿股价的那天并不一定会在最低股价那天的后面,那我们不可能今天买股票,昨天卖股票对吧。
所以现在的思路是,假设第n天买股票,那第n天的股票价格应该是第1天到第n天之间价格最低的时候。 假设第m天卖股票,那么第m天的股价,就应该是第n天到第m天之间最高的那天。
于是假设第n天买入股票,当天股价为f(n),且m>n,如果f(m) >= f(n),那就可以卖出股票,收益为f(m) - f(n); 记当前最大收益为res,res = max(f(m)-f(n)), res);当f(m) < f(n),那就说明可以在更低点买入股票,于是我们可以将f(m)设为买入点,并以m为基准,向后遍历,找到合适的时间卖出,假设在o点卖出,那f(o) – f(m)必定是大于f(o) – f(n)的。
不过如果在n 和 m点之间有一个极大值p点,能让f§ - f(n)很大,以至于m点之后,没有哪一天卖出的利润能比f§ - f(n)更大,那么在以n点为买入点,且p点为卖出点这一情况的值其实已经被记录到res中了,后面再以m点为买入点,计算利润时也会以此为对比,看是否需要更新res的值。这里也画了一个图,m点后的黄色那一段,就表示了,没有卖出点能让利润比p点更大了。
C++代码:
class Solution {
public:
int maxProfit(vector& prices) {
int size = prices.size();
int prices_min = INT_MAX;;
int ans = 0;
for(int i = 0; i < size; i++) {
prices_min = min(prices[i], prices_min);
ans = max(prices[i] - prices_min, ans);
}
return ans;
}
};
Java代码:
class Solution {
public int maxProfit(int[] prices) {
int res = 0;
int min = Integer.MAX_VALUE;
for(int i = 0; i < prices.length; i ++) {
min = Math.min(min, prices[i]);
res = Math.max(prices[i] - min, res);
}
return res;
}
}