# 0122. 买卖股票的最佳时机 II ## 题目地址(122. 买卖股票的最佳时机 II) <https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-ii/description/> ## 题目描述 ``` <pre class="calibre18">``` 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。 示例 1: 输入: [7,1,5,3,6,4] 输出: 7 解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。 随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。 示例 2: 输入: [1,2,3,4,5] 输出: 4 解释: 在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。 注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。 因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。 示例 3: 输入: [7,6,4,3,1] 输出: 0 解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。 提示: 1 <= prices.length <= 3 * 10 ^ 4 0 <= prices[i] <= 10 ^ 4 ``` ``` ## 前置知识 - [数组](https://github.com/azl397985856/leetcode/blob/master/thinkings/basic-data-structure.md) ## 公司 - 阿里 - 腾讯 - 百度 - 字节 - bloomberg ## 思路 由于我们是想获取到最大的利润,我们的策略应该是低点买入,高点卖出。 由于题目对于交易次数没有限制,因此只要能够赚钱的机会我们都不应该放过。 > 如下图,我们只需要求出加粗部分的总和即可 用图表示的话就是这样: ![](https://img.kancloud.cn/9f/6e/9f6e4a612bb784147ce9f5865a906955_555x427.jpg) ## 关键点解析 - 这类题只要你在心中(或者别的地方)画出上面这种图就很容易解决 ## 代码 语言支持:JS,C++,Java JS Code: ``` <pre class="calibre18">``` <span class="hljs-title">/** * @param {number[]} prices * @return {number} */</span> <span class="hljs-keyword">var</span> maxProfit = <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">prices</span>) </span>{ <span class="hljs-keyword">let</span> profit = <span class="hljs-params">0</span>; <span class="hljs-keyword">for</span> (<span class="hljs-keyword">let</span> i = <span class="hljs-params">1</span>; i < prices.length; i++) { <span class="hljs-keyword">if</span> (prices[i] > prices[i - <span class="hljs-params">1</span>]) { profit = profit + prices[i] - prices[i - <span class="hljs-params">1</span>]; } } <span class="hljs-keyword">return</span> profit; }; ``` ``` C++ Code: ``` <pre class="calibre18">``` <span class="hljs-keyword">class</span> Solution { <span class="hljs-keyword">public</span>: <span class="hljs-function"><span class="hljs-keyword">int</span> <span class="hljs-title">maxProfit</span><span class="hljs-params">(<span class="hljs-params">vector</span><<span class="hljs-keyword">int</span>>& prices)</span> </span>{ <span class="hljs-keyword">int</span> res = <span class="hljs-params">0</span>; <span class="hljs-keyword">for</span>(<span class="hljs-keyword">int</span> i=<span class="hljs-params">1</span>;i<prices.size();i++) { <span class="hljs-keyword">if</span>(prices[i] > prices[i<span class="hljs-params">-1</span>]) { res += prices[i] - prices[i<span class="hljs-params">-1</span>]; } } <span class="hljs-keyword">return</span> res; } }; ``` ``` Java Code: ``` <pre class="calibre18">``` <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Solution</span> </span>{ <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">int</span> <span class="hljs-title">maxProfit</span><span class="hljs-params">(<span class="hljs-keyword">int</span>[] prices)</span> </span>{ <span class="hljs-keyword">int</span> res = <span class="hljs-params">0</span>; <span class="hljs-keyword">for</span>(<span class="hljs-keyword">int</span> i=<span class="hljs-params">1</span>;i<prices.length;i++) { <span class="hljs-keyword">if</span>(prices[i] > prices[i-<span class="hljs-params">1</span>]) { res += prices[i] - prices[i-<span class="hljs-params">1</span>]; } } <span class="hljs-keyword">return</span> res; } } ``` ``` **复杂度分析** - 时间复杂度:O(N)O(N)O(N) - 空间复杂度:O(1)O(1)O(1) ## 相关题目 - [121.best-time-to-buy-and-sell-stock](121.best-time-to-buy-and-sell-stock.html) - [309.best-time-to-buy-and-sell-stock-with-cooldown](309.best-time-to-buy-and-sell-stock-with-cooldown.html) 大家对此有何看法,欢迎给我留言,我有时间都会一一查看回答。更多算法套路可以访问我的 LeetCode 题解仓库:<https://github.com/azl397985856/leetcode> 。 目前已经 37K star 啦。 大家也可以关注我的公众号《力扣加加》带你啃下算法这块硬骨头。 ![](https://img.kancloud.cn/cf/0f/cf0fc0dd21e94b443dd8bca6cc15b34b_900x500.jpg)