leetcode刷题4
Posted cquer-xjtuer-lys
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode刷题4相关的知识,希望对你有一定的参考价值。
今天刷的题是买卖股票的最佳时机,在求解的过程中,也参考了LeetCode的官方解答思路。
第一个解题的思路是采用递归的方法来做:当找到了一个赚钱的点后,更新搜索范围,继续查找。最后把所有的赚钱的加起来就对了。
第二个是采用峰谷法。首先是峰谷都是起点。先查找谷的位置。谷的位置就是前面的点都比后面的点大。然后在谷的位置之后查找峰的位置。锋的位置就是后面的点比前面的点大。然后再累加即可。
第三个方法是动态规划。状态转移方程是:prices[i]=prices[i-1](if prices[i]<=prices[i-1]) or prices[i]=prices[i-1]+prices[i-1]-prices[i] (if prices[i]>prices[i-1])
三种方法的代码如下:
public class MaxProfit /** * @Description 当输入[7,1,5,3,6,4]的时候,输出为 7 * 这是因为在第二天以价格为1买入,第三天以价格为5卖出,赚4 * 第四天以价格为3买入,第五天以价格为6卖出,赚3 * 合并起来赚7 */ public static int max(int[] prices) return caculate(prices,0); public static int caculate(int[] prices,int s) if (s>=prices.length) return 0; int max=0; for (int start=s;start<prices.length;start++) int maxProfit=0; for (int i = start+1; i <prices.length ; i++) if (prices[start]<prices[i]) int profit=caculate(prices,i+1)+prices[i]-prices[start]; if (profit>maxProfit) maxProfit=profit; if (maxProfit>max)max=maxProfit; return max; public static int max1(int[] prices) if (prices.length==0)return 0; int i=0; int maxprofit=0; int peak=prices[0]; int valley=prices[0]; while (i<prices.length-1) while (i<prices.length-1 && prices[i]>=prices[i+1]) i++; valley=prices[i]; while (i<prices.length-1 && prices[i]<=prices[i+1]) i++; peak=prices[i]; maxprofit+=peak-valley; return maxprofit; public static int max2(int[] prices) int maxProfit=0; for (int i = 0; i <prices.length-1 ; i++) if (prices[i+1]>prices[i]) maxProfit+=prices[i+1]-prices[i]; return maxProfit;
以上是关于leetcode刷题4的主要内容,如果未能解决你的问题,请参考以下文章