From 3b19c764d8cec85db1e5b2f70d867b7d21851427 Mon Sep 17 00:00:00 2001 From: whaifree <49432110+whaibetter@users.noreply.github.com> Date: Tue, 16 Apr 2024 15:43:05 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E8=AF=B4=E6=98=8E:=20?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BA=86LeetCode=E8=A7=A3=E9=A2=98=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=EF=BC=8C=E5=8C=85=E6=8B=AC=E8=82=A1=E7=A5=A8=E4=B9=B0?= =?UTF-8?q?=E5=8D=96=E9=97=AE=E9=A2=98=E3=80=81=E5=8D=95=E8=B0=83=E6=A0=88?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E4=BB=A5=E5=8F=8A=E5=AD=97=E7=AC=A6=E4=B8=B2?= =?UTF-8?q?=E7=BC=96=E8=BE=91=E8=B7=9D=E7=A6=BB=E9=97=AE=E9=A2=98=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../whaifree/leetCode/Dynamic/LeetCode64.java | 59 +++++++++ .../cn/whaifree/leetCode/Dynamic/Stock.java | 125 ++++++++++++++++++ .../leetCode/LeetCode/LeetCode72.java | 53 ++++++++ .../leetCode/MonotoneStack/LeetCode739.java | 1 - 4 files changed, 237 insertions(+), 1 deletion(-) create mode 100644 src/main/java/cn/whaifree/leetCode/Dynamic/LeetCode64.java create mode 100644 src/main/java/cn/whaifree/leetCode/LeetCode/LeetCode72.java diff --git a/src/main/java/cn/whaifree/leetCode/Dynamic/LeetCode64.java b/src/main/java/cn/whaifree/leetCode/Dynamic/LeetCode64.java new file mode 100644 index 0000000..714ecc0 --- /dev/null +++ b/src/main/java/cn/whaifree/leetCode/Dynamic/LeetCode64.java @@ -0,0 +1,59 @@ +package cn.whaifree.leetCode.Dynamic; + +import org.junit.Test; + +/** + * @version 1.0 + * @Author whai文海 + * @Date 2024/4/16 11:22 + * @注释 + */ +public class LeetCode64 { + + @Test + public void test() + { + int[][] grid = new int[][] { {1,2,3}, {4,5,6} }; + Solution solution = new Solution(); + int i = solution.minPathSum(grid); + System.out.println(i); + } + + class Solution { + /** + * dp + * int[i][j]表示到该点所需的最最小数字总和 + * + * @param grid + * @return + */ + public int minPathSum(int[][] grid) { + + int h = grid.length; + int w = grid[0].length; + int[][] dp = new int[h][w]; + dp[0][0] = grid[0][0]; + + // dp[i][j] = min(dp[i-1][j],dp[i][j-1]) + grid[i][j] + + for (int i = 0; i < h; i++) { + for (int j = 0; j < w; j++) { + if (i == 0 && j == 0) { + continue; + } + if (j == 0 && i != 0) { + dp[i][j] = dp[i - 1][j] + grid[i][j]; + continue; + } + if (i == 0 && j != 0) { + dp[i][j] = dp[i][j - 1] + grid[i][j]; + continue; + } + dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j]; + } + } + return dp[h - 1][w - 1]; + } + } + +} diff --git a/src/main/java/cn/whaifree/leetCode/Dynamic/Stock.java b/src/main/java/cn/whaifree/leetCode/Dynamic/Stock.java index 401c5b8..1bce9ec 100644 --- a/src/main/java/cn/whaifree/leetCode/Dynamic/Stock.java +++ b/src/main/java/cn/whaifree/leetCode/Dynamic/Stock.java @@ -222,3 +222,128 @@ class LeetCode121_ { } } +class LeetCode309_ { + + class Solution { + public int maxProfit(int[] prices) { + // 卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。 + /** + * boolean[] flag + * flag[i] 表示第i天是否卖出获得最大利润 + * + * s2 s3 + * dp[i][0] 表示 第i天手里不持有股票,i-1也不持有,表明在i-1之前卖出股票 手里有的钱 + * - i不持有 i-1 不持有 i-2不持有 dp[i-2][0] + * - i不持有 i-1 不持有 i-2持有,i-1卖出 dp[i-2][2] + prices[i-1] + * + * s4 + * dp[i][1] 表示i不持有,i-1持有 手里有的钱 + * - 今天为冷冻期 i卖出 dp[i-1][2] + prices[i] + * + * s1 + * dp[i][2] 表示 第i天持有股票 手里有的钱 + * - i-1有 dp[i-1][2] + * - 前一天是冷冻期 i和i-1都不持有 dp[i-1][0] - price[i] + * - 当天是冷冻期 i不持有 i-1持有 dp[i-1][1] - price[i] + * + */ + int[][] dp = new int[prices.length][2]; + boolean[] flag = new boolean[prices.length]; + + for (int i = 1; i < prices.length; i++) { + if (dp[i - 1][0] > dp[i - 1][1] + prices[i]) { + dp[i][0] = dp[i - 1][0]; + }else { + dp[i][0] = dp[i - 1][1] + prices[i]; + flag[i] = true; + } + +// if + + } + return 1; + + } + } + + class Solution1 { + /** + * 状态: + * 1. 持有dp[i][0] + * - i-1就持有 dp[i-1][0] + * - 当天买入 + * - 前一天是冷冻期 dp[i-1][3] - price[i] + * - 前一天不是冷冻期 dp[i-1][1] - price[i] + * 2. 不持有 + * - i-1就不持有,i-2或之前卖出过股票 dp[i][1] + * - i-1不持有 i-2不持有 dp[i-1][1] + * - i-1不持有 i-2持有,表明i-1卖出了 dp[i-1][2] + price[i] + * - 今天卖出 dp[i][2] + * - dp[i-1][0]+price[i] + * + * 3. 冷冻dp[i][3] + * - i-1卖出 dp[i-1][2] + * @param prices + * @return + */ + public int maxProfit(int[] prices) { + int[][] dp = new int[prices.length][4]; + dp[0][0] -= prices[0]; + for (int i = 1; i < prices.length; i++) { + dp[i][0] = Math.max(dp[i - 1][0], Math.max(dp[i - 1][3] - prices[i], dp[i - 1][1] - prices[i])); + dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][3]); + dp[i][2] = dp[i - 1][0] + prices[i]; + dp[i][3] = dp[i - 1][2]; + } + return Math.max( + dp[prices.length - 1][3], + Math.max( + dp[prices.length - 1][1], + dp[prices.length - 1][2] + ) + ); + } + + /** + * dp[i][0] 表示第i天手里没有股票的 手里的现金 + * 1. 当天卖出 dp[i-1][1] + prices[i] + * 2. i-1天就没有 + * dp[i-1][0] + * dp[i][1] 表示第i天手里有股票的 手里的现金 + * 1. 刚刚买入(考虑2天前手里没有股票,i-1天为冷冻期) dp[i-2][0] - prices[i] + * 2. i-1就持有 dp[i-1][1] + * + * 初始化 + * dp[0][0] = 0 + * dp[0][1] = -prices[0] + * dp[1][0] = Math.max(dp[0][0], dp[0][1] + prices[0]); + * dp[1][1] = Math.max(dp[0][1], dp[0][0]-prices[0]); + * + * @param prices + * @return + */ + public int maxProfit1(int[] prices) { + if(prices.length==1){ + return 0; + } + int[][] dp = new int[prices.length][2]; + dp[0][0] = 0; + dp[0][1] = -prices[0]; + dp[1][0] = Math.max(dp[0][0], dp[0][1] + prices[1]); + dp[1][1] = Math.max(dp[0][1], dp[0][0] - prices[1]); + for (int i = 2; i < prices.length; i++) { + dp[i][0] = Math.max(dp[i-1][0], dp[i-1][1] + prices[i]); + dp[i][1] = Math.max(dp[i - 1][1], dp[i - 2][0] - prices[i]); + } + return dp[prices.length - 1][0]; + } + + + + } + public static void main(String[] args) { + int[] prices = new int[]{1, 2, 3, 0, 2}; + System.out.println(new LeetCode309_().new Solution1().maxProfit1(prices)); + } +} + diff --git a/src/main/java/cn/whaifree/leetCode/LeetCode/LeetCode72.java b/src/main/java/cn/whaifree/leetCode/LeetCode/LeetCode72.java new file mode 100644 index 0000000..9e7ea44 --- /dev/null +++ b/src/main/java/cn/whaifree/leetCode/LeetCode/LeetCode72.java @@ -0,0 +1,53 @@ +package cn.whaifree.leetCode.LeetCode; + +import org.junit.Test; + +/** + * @version 1.0 + * @Author whai文海 + * @Date 2024/4/16 11:45 + * @注释 + */ +public class LeetCode72 { + + @Test + public void test() + { + String word1 = "horse"; + String word2 = "ros"; + int res = new Solution().minDistance(word1, word2); + System.out.println(res); + } + + class Solution { + public int minDistance(String word1, String word2) { + // dp[i][j] 表示将word1的第i个位置字符 替换为 word2的第j个字符所需的最小操作数 + // - 删除 dp[i-1][j] + // - 增加 dp[i][j-1] + // - 替换 dp[i-1][j-1] + // dp[i][j] = min +1 + int wL1 = word1.length(); + int wL2 = word2.length(); + int[][] dp = new int[wL1 + 1][wL2 + 1]; + for (int i = 0; i <= wL1; i++) { + dp[i][0] = i; + } + for (int i = 0; i <= wL2; i++) { + dp[0][i] = i; + } + + for (int i = 1; i <= wL1; i++) { + for (int j = 1; j <= wL2; j++) { + if (word1.charAt(i - 1) == word2.charAt(j - 1)){ + // 如果对应位置两个字母相等,不用做任何操作,直接使用dp[i - 1][j - 1] + dp[i][j] = dp[i - 1][j - 1]; + } else { + dp[i][j] = Math.min(Math.min(dp[i - 1][j - 1], dp[i][j - 1]), dp[i - 1][j]) + 1; + } + } + } + return dp[wL1][wL2]; + } + } + +} diff --git a/src/main/java/cn/whaifree/leetCode/MonotoneStack/LeetCode739.java b/src/main/java/cn/whaifree/leetCode/MonotoneStack/LeetCode739.java index 5166d71..7b1a565 100644 --- a/src/main/java/cn/whaifree/leetCode/MonotoneStack/LeetCode739.java +++ b/src/main/java/cn/whaifree/leetCode/MonotoneStack/LeetCode739.java @@ -21,7 +21,6 @@ public class LeetCode739 { Solution solution = new Solution(); int[] res = solution.dailyTemperatures(temperatures); System.out.println(Arrays.toString(res)); - } class Solution {