买卖股票的最佳时机

买卖股票的最佳时机:

题目:

给定一个数组 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;
}
}

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值