题目描述
题干:
给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。
示例1:
输入:[7,1,5,3,6,4]
输出:5
解释:
在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。
示例2:
输入:prices = [7,6,4,3,1]
输出:0
解释:
在这种情况下, 没有交易完成, 所以最大利润为 0。
题解思路
股票当然大多数人都听说但是没有接触过,如果换到基金的话还是大部分人都会了解的,其实赚钱的道理都是一样的
自然就是题干所说的,低买高卖,最赔钱的就是那种追涨杀跌,不能很好看到未来局势的,不得不吐槽一下今年牛年的股市从开年到现在确实不太景气
所以这道题让我们找最大的利润,当然是低价买进,高价卖出的最优解,当然暴力解法总是最先被想到,但是系统会提示你超出时间限制
那就必须转换思路,我们只要找到最低的价格,然后找打最高的差价,这就是我们面临的两个问题,现在如果分成两步,那也是遍历两次,还是不够划算
我们要考虑到一旦找到更低的价格,我们就不必考虑前面的了,所以我们可以把它们放到一个循环中去
正确代码
public int maxProfit1(int prices[]){
//profit1用来寻找最低的价格,profit2用来返回最高的差价
int profit1 = Integer.MAX_VALUE;
int profit2 = 0;
for (int i = 0; i < prices.length; i++) {
if (prices[i] <profit1) profit1 = prices[i];
else if (prices[i] - profit1 >profit2) profit2 = prices[i] - profit1;
}
return profit2;
}
总结
相信大家已经看到了我的方法名是maxProfit1,说明暴力求解的方法被我省略掉了,但是结果是对的
虽然每次我都会尝试暴力求解,但是我知道这肯定不是它最好的办法,可是你用自己的方法做出结果确实可以让人愉悦
对于这道题的解法没有太多要去赘述的,如果你看到这篇文章也在炒股或者玩基金的话,祝你财源广进!
文章如果存在问题或者有更好的题解,希望大佬斧正和评论,各自努力,你我最高处见