#不是一天一练,有空闲时间就会来练的~
121. 买卖股票的最佳时机
给定一个数组
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。
看到这个示例,我想着是用双指针,固定一个左指针不动,然后让右指针先行,找到比当前指针所指的数字小的,然后作差,保留这些差值,找出最大的差值即最大利润。
我的代码如下
但是最后超时了!下面这个测试案例还真的是挺恶心人的!
看了一下官方题解和别人的解读,大致意思是说,如果第i天卖出了股票,则最大利润为(该天的股价-前面天数中最小的股价),然后与现有的最大利润比较,如果大于则更新当前最大利润的值。以下是别人的代码,简洁明了,很美丽了!
122. 买卖股票的最佳时机 II
给你一个整数数组
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。
看到这道题,大脑有点小小宕机,因为不知道需要保留哪些数字,后面看到一个很厉害的题解,这个是一个大佬做的,的确只要两天相隔是上升的,说明可以卖出,可以保留这个利润,所以只需要比较前后两天是否是上升的即可,最后进行一个累加。
以上出处来自
作者:Krahets 链接:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii/solutions/12625/best-time-to-buy-and-sell-stock-ii-zhuan-hua-fa-ji/ 来源:力扣(LeetCode)
以下也是在此基础上的代码改进:
的确做之前,应该先确定一个好的思路,然后再动手,就会发现其实也没有那么难,的确思路真的很重要,今天结束~