一假期番外篇——动态规划,Leetcode121

Posted 小可爱的大笨蛋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一假期番外篇——动态规划,Leetcode121相关的知识,希望对你有一定的参考价值。

春节期间,根本没时间去做项目,只能开启刷题模式,决定以Leetcode为平台,入坑算法,重新学习动态规划。

选择的题目是Leetcode的第121题:买卖股票的最佳时机。

这是Leetcode的题目描述,接下来就开始解决。

刚开始考虑的是暴力破解:假设当前为买入,之后的所有都为卖出,算出每一个的差值,返回最大差值。

    public static int maxProfit(int[] prices) 
    	int n = prices.length;
    	int max = 0;
    	for(int i=0;i<n;i++) 
    		for(int j=i+1;j<n;j++) 
    			int diff = prices[j] - prices[i];
    			if(diff < 0) diff = 0;
    			if(max < diff) max = diff;  			
    		
    	
    	return max;
    

提交运行一下

有点水,接下来优化一下,暴力破解的时间复杂度是O(n2),那就想办法优化成时间复杂度为O(n):

我的思路是这样的:加入4个变量,max,min,first,last,4个变量的作用分别是max指向最大的,min指向最小的,first是买入的位置,last是卖出的位置,如果last比first小的话,那就让last指向first,然后max等于min,每次计算一次差值,返回最大的差值。代码如下:

    public static int maxProfit_p(int[] prices) 
    	if(prices.length <= 0) 
    		return 0;
    	
    	int min,max;
    	int diff = 0;
    	min = max =prices[0];
    	int first=0,last=0;
    	for(int i=1;i<prices.length;i++) 
    		if(max < prices[i]) max = prices[i]; last=i;
    		if(min > prices[i]) min = prices[i]; first =i;
    		if(last < first) last = first; max = min;
    		if(diff < (max - min)) diff = max-min;
    	
    	return diff;
    

提交一下:

发现已经达到了100%,但这不是我们想要的,我们想要的是使用动态规划,接下来就是动态规划。

首先,在计算任意一个位置的最佳时机时应该有两种选择,即当前点是最佳时机,或者不是最佳时机,如果当前点是最佳时机,应该等于当前时机的价格减去之前最小的价格,如果不是最佳时机,就等于它前一个的最佳时机。OK,直接上代码:

  public static int maxProfit_dp(int[] prices) 
    	int minP = Integer.MAX_VALUE;  // 最小的价格
    	int maxDiff = 0; // 最大的差值
    	for(int i=0;i<prices.length;i++) 
    		if(minP > prices[i]) minP = prices[i];
    		if(maxDiff < (prices[i] - minP)) maxDiff = prices[i] - minP;
    	
    	return maxDiff;
    

提交一下:

万事大吉。

总结:重点在于总结出问题过程中的讲问题转换成子问题,然后写出方程的过程。

以上是关于一假期番外篇——动态规划,Leetcode121的主要内容,如果未能解决你的问题,请参考以下文章

[LeetCode] 121. 买卖股票的最佳时机 ☆(动态规划)

LeetCode ---- 买卖股票系列问题思路与题解

LeetCode ---- 买卖股票系列问题思路与题解

SpringCloud番外篇-服务治理之Nacos

动态规划_leetcode121(好难,双状态)

基于Cesium的实景三维模型动态更新-以3Dtiles为例(番外篇)