【Leecode122】买卖股票的最佳时机 II

文章探讨了一个关于股票交易的问题,给定一个整数数组表示股票价格,目标是找到在最多持有一股股票的情况下能获得的最大利润。通过分析股票价格的增减,作者提出一种策略,即在价格上涨时买入并下跌时卖出,避免在股票下跌时进行交易。最终,提供了一段JavaScript代码实现该策略,计算连续两天价格差的累加和作为最大利润。
摘要由CSDN通过智能技术生成

题目:给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。

在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。

返回 你能获得的 最大 利润 。

示例 1:

输入:prices = [7,1,5,3,6,4]
输出:7
解释:在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4 。
     随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6 - 3 = 3 。
     总利润为 4 + 3 = 7 。
示例 2:

输入:prices = [1,2,3,4,5]
输出:4
解释:在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4 。
     总利润为 4 。
示例 3:

输入:prices = [7,6,4,3,1]
输出:0
解释:在这种情况下, 交易无法获得正利润,所以不参与交易可以获得最大利润,最大利润为 0 。


思考:
    首先根据题目意思,给出的数组(设数组长度为len),其实是一支股票在len天内,自身价格的上下波动,假设我在第天买入,那么我要花费的就是prices[i]的价格,这属于本金,然后我要在第n天卖出,即prices[n]的价格,相减就是利润(有可能为负数),而我们要计算的就是在len天内,一次或多次的进行买卖股票,使得最后能获得的利润相加最大。
    初步感觉很复杂,因为看起来需要计算的次数就像可能性一样非常之多
    我先这样想,在股票最低的时候买入,在股票高的时候卖出,这样就可以获得利益
    1.
        我在第x天买入,再在x天之后的某一天比如说y天卖出,y天是在x天之后的能找到的最大值,那么这看起来似乎就是我能获取的最大利润,然而我们还需要考虑的就是,如果我在最高的那一天卖出,那么我就只能做出这最后一次交易了,只能获取一次利润,因为y已经是邮票的峰值,之后再卖出只能是负利润,也就只能亏损了,所以这种情况不太理想。
    2.
        我在第x天买入,在x天之后的某一天y卖出,这个y不一定是峰值最高的那一天,为了获取利润,我们只要挑选比x这天高的股票值卖出就能获取利润,然而这个时候我们就要再考虑,如果我们在这个y天卖出,之后是否还有价格更高的时候可以再次卖出?然而这时我们在y天已经将股票卖出,想要再次进行买卖就要再次买入股票,这个买入股票的时机可能是y天,也可能是y之后的某一天,然后,再次找到比买入价格高的那一天卖出,计算其中能够获取的利润,这听起来很复杂,我们好像就要做出选择,要找到利益最大的那一天卖出,又要避免像第一种情况那样一锤子买卖,以免忽略更多能获取交易利益的可能性。
        (所以我想到这里脑袋已经糊涂了😥)
    3.
        后来我再想想,其实是自己把自己代入了怪圈,我总是在考虑第二条的那种情况,但是其实陷入的是第一条的坑,假设我在y天卖出了,之后还有可以再度获取利润的情况,也就是说股票仍然在涨,我还想去获取这个利润的话就要注意到我要再次买入,再次买入的价格就是y天这天我买出的价格,也就是说我的基数已经改变,获取的利润大小也不是(假设再次卖出的天数是z)z-x,而是z-y。那么在这里就需要脑袋转个弯,想想看,为了获取利润,
           

        我们假设一个股票在涨的趋势[1,4,6],如果我在第一天买入,第三天卖出,那么6-1=5,我获取的利润是5,还有就是我在第一天买入,第二天卖出,然后再以第二天的价格买入,以便第三天卖出,那么实际上我所做的操作就是(4-1)+(6-4)=5,结果还是等于5,也就是说,只要股票在涨,只要能够获取利润,我不管是只要能获取利润就卖出,还是等到价格最好的时候再卖出,能获得的利润是一样的。


            Ⅱ

        接着,我们对上面的例子做一点改动,假设股票的走向不单单是涨,它有一定的起伏[3,2,4,6,2,7,3],(在做题过程中,我们应该时刻牢记,我们每做一次减法,实际上就是一次买进和卖出,同时还要注意不要陷入刻板印象中,我们第一天不一定要持有股票,是可以在其他天数买进股票的),如果一上来就抱有(我在第一天买入,什么时候卖出才能利益最大化这种想法是很不利的),那么回到正题,由Ⅰ可得,只要是涨幅(也就是后一天减前一天为正数)就可以直接计算当天买入第二天卖出...当天买入第二天卖出...当天买入第二天卖出...像这样,如果中间只要有负数情况,也就是股票跌了,我就不进行买卖,也就是说一直处在一个可以获得利益的状态中。在本题中,由于我们是一个上帝视角,所以能够看得很清楚,像在这里举例的数组[3,2,4,6,2,7,3],其中6、2、7这样的状况就是一个典型的例子,如果我们采用2.的想法,使自身一直处于一个不间断的状态,在面对这种情况时就会陷入一个死局,如果我在6的时候没有卖出当我想要获取7-2=5的利润时,我就必须以6的价格去获取2的然后在去获取7的利润,看起来这个操作似乎是(2-6)+(7-2)=1😰,这样根本达不到我们的目的,然而实际上,按照只要一有利润我就卖出,一亏损我就按兵不动的状态来考虑,其实我们是避开了这个-4的亏损的,这里当我说到“如果我在6的时候没有卖出当我想要获取7-2=5的利润时”,其实是混淆了视线,让人误以为我手上的股票此时的价格是6,这里注意“我手上”,也就是说我默认我以6的价格买入了这支股票,然后我就要面对第二天股票大跌,我要亏损-4的情况,但实际上,我前面说过,我们处于一个上帝视角,也就是说我们是直到这里会有一个-4的亏损的,既然如此,我们为什么不避开这个亏损,不在股价为6的时候买进?实际上“当天买入第二天卖出...当天买入第二天卖出...当天买入第二天卖出...像这样,如果中间只要有负数情况,也就是股票跌了,我就不进行买卖”这里,已经实现了这个操作,我会停留在‘在股价为6的那一天卖出’,而不在卖出的同一天买入,转而在2的时候买入,7的时候卖出,这样就直接获取了5的利润,而不会有亏损。
            也就是说,事情的一切都建立在我们已经知道了会发生什么事的情况下,当然在现实世界中不会有这样的事就是了🤦‍♀️
            Ⅲ

综上,我们只要贯彻执行“直接计算当天买入第二天卖出...当天买入第二天卖出...当天买入第二天卖出...像这样,如果中间只要有负数情况,也就是股票跌了,我就不进行买卖”这一条就可以了,那么直接转换成代码:

const prices = [7, 1, 5, 3, 2, 6, 4];
var maxProfit = function (prices) {
  let sum = 0;
  for (let i = 0; i < prices.length; i++) {
    if (prices[i + 1] > prices[i]) {
      sum += prices[i + 1] - prices[i];
    }
  }
  return sum;
};
console.log(maxProfit(prices));

仔细想想我之所以能写这么多果然还是因为表达能力和理解能力太差了吧😢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值