股票(无限次交易)
题目:假定你知道某只股票每一天价格的变动。你最多可以同时持有一只股票。但你可以无限次的交易(买进和卖出均无手续费)。请设计一个函数,计算你所能获得的最大收益。
思路:
代码:
1.常规算法:找到曲线的最大值peak和最小值valley
1 /** 2 * @param {number[]} prices 3 * @return {number} 4 */ 5 var maxProfit = function(prices) { 6 if(prices.length === 0){ 7 return 0; 8 } 9 let profit = 0, valley = prices[0], peak = prices[0]; 10 let i = 0; 11 while(i < prices.length - 1){ 12 while(i<prices.length - 1 && prices[i] >= prices[i+1]){ 13 i++; 14 } 15 valley = prices[i]; 16 while(i<prices.length - 1 && prices[i] <= prices[i+1]){ 17 i++; 18 } 19 peak = prices[i]; 20 profit += peak - valley; 21 } 22 return profit; 23 };
2.贪心算法:
只要涨价,就先买后卖,将差价加入结果中
只要降价,就按兵不动,更新当前位置
时间复杂度:O(n),其中 nn 为数组的长度。我们只需要遍历一次数组即可
空间复杂度:O(1)。只需要常数空间存放若干变量
-
贪心算法:对问题求解的时候,总是做出在当前看来是最好的做法
-
适用贪心算法的场景:问题能够分解成子问题来解决,子问题的最优解能递推到最终问题的最优解。这种子问题最优解成为最优子结构
- 贪心算法与动态规划的不同在于它对每个子问题的解决方案都作出选择,不能回退,动态规划则会保存以前的运算结果,并根据以前的结果对当前进行选择,有回退功能,而回溯算法就是大量的重复计算来获得最优解
1 /** 2 * @param {number[]} prices 3 * @return {number} 4 */ 5 var maxProfit = function(prices) { 6 if(prices.length === 0 ){ 7 return 0; 8 } 9 let profit = 0; 10 for(let i = 0; i<prices.length; i++){ 11 if(prices[i]<prices[i+1]){ 12 profit += prices[i+1] - prices[i]; 13 } 14 } 15 return profit; 16 };

浙公网安备 33010602011771号