![](https://img-blog.csdnimg.cn/20190927151043371.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
动态规划
0
Charlesjjc
这个作者很懒,什么都没留下…
展开
-
42. 接雨水
42. 接雨水class Solution { public int trap(int[] height) { Deque<Integer> st = new LinkedList<>(); st.addLast(0); int res = 0; for(int i = 1;i < height.length;i++){ while(st.size() > 0 &原创 2021-09-01 21:19:30 · 53 阅读 · 0 评论 -
516. 最长回文子序列
516. 最长回文子序列class Solution { public int longestPalindromeSubseq(String s) { int[][] dp = new int[s.length()][s.length()]; for(int i = s.length() - 1; i >= 0;i--){ for(int j = i; j < s.length();j++){原创 2021-09-01 02:31:58 · 81 阅读 · 0 评论 -
647. 回文子串
647. 回文子串class Solution { public int countSubstrings(String s) { boolean[][] dp = new boolean[s.length()][s.length()]; for(int i = s.length() - 1;i >= 0;i--){ for(int j = i;j < s.length();j++){ if(s原创 2021-09-01 02:07:14 · 91 阅读 · 0 评论 -
72. 编辑距离
72. 编辑距离class Solution { public int minDistance(String word1, String word2) { int[][] dp = new int[word1.length() + 1][word2.length() + 1]; for(int i = 0; i < word1.length() + 1;i++) dp[i][0] = i; for(int i = 0; i < w.原创 2021-09-01 01:25:22 · 62 阅读 · 0 评论 -
583. 两个字符串的删除操作
583. 两个字符串的删除操作class Solution { public int minDistance(String word1, String word2) { int[][] dp = new int[word1.length() + 1][word2.length() + 1]; for(int i = 0; i < word1.length() + 1;i++) dp[i][0] = i; for(int i = 0; i &原创 2021-08-31 14:53:18 · 66 阅读 · 0 评论 -
115. 不同的子序列
115. 不同的子序列class Solution { public int numDistinct(String s, String t) { int[][] dp = new int[s.length() + 1][t.length() + 1]; for(int i = 0; i < s.length() + 1;i++) dp[i][0] = 1; for(int i = 1; i < s.length() + 1;i++){原创 2021-08-31 00:13:02 · 67 阅读 · 0 评论 -
392. 判断子序列
392. 判断子序列class Solution { public boolean isSubsequence(String s, String t) { boolean[][] dp = new boolean[s.length() + 1][t.length() + 1]; for(int i = 0;i < t.length() + 1;i++) dp[0][i] = true; for(int i = 1; i < s.len原创 2021-08-30 23:23:54 · 51 阅读 · 0 评论 -
53. 最大子序和
53. 最大子序和class Solution { public int maxSubArray(int[] nums) { int[] dp = new int[nums.length]; dp[0] = nums[0]; int max = dp[0]; for(int i = 1;i < nums.length;i++){ dp[i] = Math.max(nums[i],dp[i - 1] +原创 2021-08-30 22:20:19 · 50 阅读 · 0 评论 -
1035. 不相交的线
1035. 不相交的线class Solution { public int maxUncrossedLines(int[] nums1, int[] nums2) { int[][] dp = new int[nums1.length + 1][nums2.length + 1]; int max = 0; for(int i = 1; i < nums1.length + 1;i++){ for(int j =原创 2021-08-30 21:47:28 · 49 阅读 · 0 评论 -
1143. 最长公共子序列
1143. 最长公共子序列class Solution { public int longestCommonSubsequence(String text1, String text2) { int[][] dp = new int[text1.length() + 1][text2.length() + 1]; int max = 0; for(int i = 1; i < text1.length() + 1;i++){原创 2021-08-30 20:49:31 · 50 阅读 · 0 评论 -
718. 最长重复子数组
718. 最长重复子数组class Solution { public int findLength(int[] nums1, int[] nums2) { int[][] dp = new int[nums1.length + 1][nums2.length + 1]; int max = 0; for(int i = 1; i <= nums1.length;i++){ for(int j = 1;j <=原创 2021-08-30 19:30:48 · 52 阅读 · 0 评论 -
674. 最长连续递增序列
674. 最长连续递增序列class Solution { public int findLengthOfLCIS(int[] nums) { int length = 1; int max = 1; for(int i = 1; i < nums.length;i++){ if(nums[i] > nums[i - 1]){ length++; }els原创 2021-08-30 19:14:04 · 50 阅读 · 0 评论 -
300. 最长递增子序列
300. 最长递增子序列class Solution { public int lengthOfLIS(int[] nums) { int[] dp = new int[nums.length]; Arrays.fill(dp, 1); int res = 1; for(int i = 1; i < nums.length;i++){ for(int j = 0; j < i;j++){原创 2021-08-30 18:34:29 · 48 阅读 · 0 评论 -
714. 买卖股票的最佳时机含手续费
714. 买卖股票的最佳时机含手续费class Solution { public int maxProfit(int[] prices, int fee) { int[][] dp = new int[prices.length + 1][2]; dp[0][0]= -prices[0] - fee; for(int i = 1; i < prices.length + 1;i++){ int price = pr原创 2021-08-30 00:03:56 · 50 阅读 · 0 评论 -
309. 最佳买卖股票时机含冷冻期
309. 最佳买卖股票时机含冷冻期感觉都上hard了class Solution { public int maxProfit(int[] prices) { int[][] dp = new int[prices.length + 1][4]; dp[0][0] = -prices[0]; for(int i = 1; i <= prices.length;i++){ int price = prices[i原创 2021-08-29 23:47:42 · 167 阅读 · 0 评论 -
188. 买卖股票的最佳时机 IV
188. 买卖股票的最佳时机 IVclass Solution { public int maxProfit(int k, int[] prices) { if(prices.length < 2 || k == 0) return 0; int[] dp = new int[k*2]; for(int i = 0; i < k;i++){ dp[i*2] = -prices[0]; }原创 2021-08-27 18:20:22 · 47 阅读 · 0 评论 -
123. 买卖股票的最佳时机 III
123. 买卖股票的最佳时机 IIIclass Solution { public int maxProfit(int[] prices) { int[][] dp = new int[prices.length + 1][5]; dp[0][0] = 0; dp[0][1] = -prices[0]; dp[0][3] = -prices[0]; for(int i = 1; i < prices.leng原创 2021-08-27 17:52:42 · 52 阅读 · 0 评论 -
122. 买卖股票的最佳时机 II
122. 买卖股票的最佳时机 IIclass Solution { public int maxProfit(int[] prices) { int[][] dp = new int[prices.length + 1][2]; dp[0][0] = Integer.MIN_VALUE; for(int i = 1;i < prices.length + 1;i++){ int price = prices[i -原创 2021-08-27 03:09:44 · 41 阅读 · 0 评论 -
121. 买卖股票的最佳时机
121. 买卖股票的最佳时机class Solution { public int maxProfit(int[] prices) { int[][] dp = new int[prices.length + 1][2]; dp[0][0] = Integer.MIN_VALUE; for(int i = 1; i < prices.length + 1;i++){ int price = prices[i - 1]原创 2021-08-26 17:10:17 · 49 阅读 · 0 评论 -
337. 打家劫舍 III
337. 打家劫舍 IIIclass Solution { public int rob(TreeNode root) { int[] res = new int[2]; res = robAction(root); return Math.max(res[0],res[1]); } public int[] robAction(TreeNode node){ int res[] = new int[2];原创 2021-08-26 15:14:44 · 45 阅读 · 0 评论 -
213. 打家劫舍 II
213. 打家劫舍 II// 动态规划class Solution { public int rob(int[] nums) { if (nums == null || nums.length == 0) return 0; if (nums.length == 1) return nums[0]; if(nums.length == 2) return Math.max(nums[0],nums[1]); int[][] dp = new int[nums.leng原创 2021-08-20 21:19:52 · 89 阅读 · 0 评论 -
198. 打家劫舍
198. 打家劫舍class Solution { public int rob(int[] nums) { int[][] dp = new int[nums.length][2]; if(nums.length == 1) return nums[0]; dp[0][0] = nums[0]; dp[0][1] = 0; if(nums[1] > nums[0]){ dp[1][0原创 2021-08-20 15:28:28 · 59 阅读 · 0 评论 -
139. 单词拆分
139. 单词拆分class Solution { public boolean wordBreak(String s, List<String> wordDict) { boolean[] dp = new boolean[s.length() + 1]; dp[0] = true; for(int i = 1;i <= s.length();i++){ for(int j = 0;j < wo原创 2021-08-20 03:37:41 · 393 阅读 · 0 评论 -
279. 完全平方数
279. 完全平方数class Solution { public int numSquares(int n) { int[] dp = new int[n + 1]; for(int i = 1;i <= n; i++){ dp[i] = i; for(int j = 1; j < 101;j++){ if(i - j*j >= 0) dp[i]原创 2021-08-20 03:21:15 · 344 阅读 · 0 评论 -
322. 零钱兑换
322. 零钱兑换class Solution { public int coinChange(int[] coins, int amount) { int[] dp = new int[amount + 1]; dp[0] = 0; for(int i = 1; i <= amount;i++){ dp[i] = 10010; for(int j = 0;j < coins.lengt原创 2021-08-20 03:12:23 · 513 阅读 · 0 评论 -
70. 爬楼梯
70. 爬楼梯class Solution { public int climbStairs(int n) { if(n < 4) return n; int[] dp = new int[n + 1]; dp[0] = 0; dp[1] = 1; dp[2] = 2; for(int i = 3; i <= n;i++){ for(int j原创 2021-08-20 02:55:07 · 160 阅读 · 0 评论 -
377. 组合总和 Ⅳ
377. 组合总和 Ⅳclass Solution { public int combinationSum4(int[] nums, int target) { int[] dp = new int[target + 1]; dp[0] = 1; for(int j = 0; j <= target;j++){ for(int i = 0;i < nums.length;i++){原创 2021-08-20 02:36:32 · 40 阅读 · 0 评论 -
518. 零钱兑换 II
518. 零钱兑换 IIclass Solution { public int change(int amount, int[] coins) { int[] dp = new int[amount + 1]; dp[0] = 1; for(int i = 1; i < coins.length + 1;i++){ int coin = coins[i - 1]; for(int j = co原创 2021-08-20 02:25:43 · 50 阅读 · 0 评论 -
474. 一和零
474. 一和零class Solution { public int findMaxForm(String[] strs, int m, int n) { int[][] dp = new int[m + 1][n + 1]; for(int i = 1;i <= strs.length;i++){ String str = strs[i - 1]; int one = 0;原创 2021-08-20 00:53:52 · 89 阅读 · 0 评论 -
494. 目标和
494. 目标和class Solution { public int findTargetSumWays(int[] nums, int target) { int sum = 0; for(int num : nums) sum += num; int left = (target + sum) / 2; if(target > sum) return 0; if((target + sum) % 2 =原创 2021-08-19 23:33:04 · 41 阅读 · 0 评论 -
1049. 最后一块石头的重量 II
1049. 最后一块石头的重量 IIclass Solution { public int lastStoneWeightII(int[] stones) { int sum = 0; for(int i = 0;i < stones.length;i++){ sum += stones[i]; } int target = sum / 2; int[][] dp = new int原创 2021-08-19 04:07:47 · 361 阅读 · 0 评论 -
416. 分割等和子集
416. 分割等和子集0-1背包问题,先来一个二维数组的class Solution { public boolean canPartition(int[] nums) { int sum = 0; int maxNum = 0; for(int num:nums){ sum += num; maxNum = Math.max(maxNum,num); } .原创 2021-08-18 02:49:32 · 73 阅读 · 0 评论 -
96. 不同的二叉搜索树
96. 不同的二叉搜索树class Solution { public int numTrees(int n) { int[] dp = new int[n + 1]; if(n < 3) return n; dp[0] = 1; dp[1] = 1; dp[2] = 2; for(int i = 3; i < n + 1;i++){ for(int j = i原创 2021-08-17 02:38:47 · 79 阅读 · 0 评论 -
343. 整数拆分
343. 整数拆分class Solution { public int integerBreak(int n) { int[] dp = new int[n + 1]; if(n == 2) return 1; if(n == 3) return 2; dp[1] = 1; dp[2] = 2; dp[3] = 3; for(int i = 4; i <= n;i++){原创 2021-08-17 01:22:15 · 48 阅读 · 0 评论 -
63. 不同路径 II
63. 不同路径 IIclass Solution { public int uniquePathsWithObstacles(int[][] obstacleGrid) { int m = obstacleGrid.length; int n = obstacleGrid[0].length; if(obstacleGrid[0][0] == 1 || obstacleGrid[m - 1][n - 1] == 1) return 0;原创 2021-08-16 23:40:45 · 62 阅读 · 0 评论 -
62. 不同路径
62. 不同路径class Solution { public int uniquePaths(int m, int n) { int[][] path = new int[m][n]; for(int i = 0; i < m; i++) { path[i][0] = 1; } for(int i = 0; i < n; i++) { path[0][i] = 1;原创 2021-08-16 23:09:25 · 59 阅读 · 0 评论 -
746. 使用最小花费爬楼梯
746. 使用最小花费爬楼梯\class Solution { public int minCostClimbingStairs(int[] cost) { if(cost.length < 3) return Math.min(cost[1],cost[0]); for(int i = 2;i < cost.length;i++){ cost[i] = cost[i] + Math.min(cost[i - 1],cost[原创 2021-08-16 22:44:49 · 40 阅读 · 0 评论 -
70. 爬楼梯
70. 爬楼梯class Solution { public int climbStairs(int n) { if(n < 4) return n; int[] dp = new int[n]; dp[0] = 1; dp[1] = 2; for(int i = 2;i < n;i++){ dp[i] = dp[i - 1] + dp[i - 2]; }原创 2021-08-16 15:53:51 · 56 阅读 · 0 评论 -
509. 斐波那契数
509. 斐波那契数class Solution { public int fib(int n) { if (n < 2) { return n; } int p = 0, q = 0, r = 1; for (int i = 2; i <= n; ++i) { p = q; q = r; r = p + q;原创 2021-08-16 12:15:04 · 49 阅读 · 0 评论