代码随想录算法训练营第五十天 | 买卖股票的最佳时机III、买卖股票的最佳时机IV

● 今日学习的文章链接和视频链接

题目123.买卖股票的最佳时机III
题目188.买卖股票的最佳时机IV

● 看到题目的第一想法

两个hard题 但是掌握思路后不难

● 看完代码随想录之后的想法

很清晰

● 实现过程中遇到哪些困难

123

● 解题代码

  1. 点击查看代码
    class Solution {
        public int maxProfit(int[] prices) {
    		if(prices.length == 1) return 0;
    		int[][] dp = new int[prices.length][5];
    		dp[0][0] = 0;
    		dp[0][1] = -prices[0];
    		dp[0][2] = 0;
    		dp[0][3] = -prices[0];
    		dp[0][4] = 0;
    		for (int i = 1; i < prices.length; i++) {
    			dp[i][0] = dp[i-1][0];//不操作
    			dp[i][1] = Math.max(dp[i-1][1],dp[i-1][0] - prices[i]);//第一次持有
    			dp[i][2] = Math.max(dp[i-1][2],dp[i-1][1] + prices[i]);//第一次不持有
    			dp[i][3] = Math.max(dp[i-1][3],dp[i-1][2] - prices[i]);//第二次持有
    			dp[i][4] = Math.max(dp[i-1][4],dp[i-1][3] + prices[i]);//第二次不持有
    		}
    		return dp[prices.length-1][4];
        }
    }
    
  2. 点击查看代码
    class Solution {
        public int maxProfit(int k, int[] prices) {
    		if(prices.length == 1) return 0;
    		int[][] dp = new int[prices.length][1+2*k];
    		dp[0][0] = 0;
    		for (int i = 1; i < 1+2*k; i += 2) {
    			dp[0][i] = -prices[0];
    			dp[0][i+1] = 0;
    		}
    		for (int i = 1; i < prices.length; i++) {
    			dp[i][0] = dp[i-1][0];
    			for (int j = 1; j < 1+2*k; j += 2) {
    				dp[i][j] = Math.max(dp[i-1][j],dp[i-1][j-1] - prices[i]);//第0天持有
    				dp[i][j+1] = Math.max(dp[i-1][j+1],dp[i-1][j] + prices[i]);//第k天不持有
    			}
    		}
    		return dp[prices.length-1][2*k];
        }
    }
    

● 今日收获,学习时长

今日收获:学习了思路
学习时长:2h
posted @ 2024-01-18 21:14  雨年今天有记录吗  阅读(4)  评论(0)    收藏  举报