ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
:-: 1.4 买卖股票的最佳时机 II * * * * * **题干:** 给定一个数组,它的第 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。 ~~~ **题目分析:** 根据题目要求我们可以连续买入卖出,尽可能多的进行买入卖出,获取最大的利润,这就是要我们将所有有可能的交易的值相加。 **新手有可能遇到的解题思路陷阱:** 有可能受上题的影响还是以为是要选一个最优解呢或者是进行一次操作 **解题思路分析以及代码实现:** 第一种思路:有序无序分开处理,无序处理部分有序,有序直接处理(我们将数组分为两种来处理,一种是有序,一种无序,有序直接尾部元素减头部元素,差值为最大利润,无序数组找部分有序元素然后在这个部分有序中尾部元素减头部元素,所有部分有序元素的差值相加就是最大利润)。 第一种思路代码: ~~~ public static int maxProfit(int[] prices) { if (prices.length < 2) return 0; int sum = 0; for (int i = 0; i < prices.length; i++) { for (int j = i; j < prices.length - 1; j++) { if (j + 2 == prices.length && prices[j + 1] > prices[j]) { sum += prices[j + 1] - prices[i]; i = j + 1; break; } if (prices[j] >= prices[j + 1]) { sum += prices[j] - prices[i]; i = j; break; } } } return sum; } ~~~ **复杂度分析** 时间复杂度:有序O(n),无序O(n^2)。 空间复杂度:O(1)。 第二种思路:所有数组统一处理,定义最大利润变量,后者大前者就相减,差值加入最大利润,前者大于后者就忽略(我们将数组统一看待,然后定义一个最大利润变量,当所取元素的后一个元素大于所取元素,就后者减去前者,并把差值加入最大利润变量,若是前者大于后者,不做处理,直接从下一个元素继续以上操作,直至循环结束)。 第二种思路代码: ~~~ public static int maxProfit(int[] prices) { if (prices.length < 2) return 0; int sum = 0; for (int i = 0; i < prices.length - 1; i++) { if (prices[i] < prices[i + 1]) { sum += prices[i + 1] - prices[i]; } else { continue; } } return sum; //另一种实现方式 /*if (prices.length < 2) return 0; int minPrice = prices[0]; int sumProfit = 0; for (int i = 1; i < prices.length; i++) { if (minPrice < prices[i]) { sumProfit += prices[i] - minPrice; minPrice = prices[i]; } else { minPrice = prices[i]; } } return sumProfit;*/ } ~~~ **复杂度分析** 时间复杂度:O(n)。 空间复杂度:O(1)。 **若有理解错误的、写错的地方、更好的思路,方法,望各位读者评论或者发邮件指正或指点我,不胜感激。**