From 051dfbf2ab0819e40e443da69e2da700f5e8f659 Mon Sep 17 00:00:00 2001 From: liu13 <1099976891@qq.com> Date: Tue, 12 Mar 2019 14:00:44 +0800 Subject: [PATCH] 20190312 --- code/lc120.java | 34 ++++++++++++++++++++++++++++++++++ code/lc213.java | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+) create mode 100644 code/lc120.java create mode 100644 code/lc213.java diff --git a/code/lc120.java b/code/lc120.java new file mode 100644 index 0000000..6d2c79c --- /dev/null +++ b/code/lc120.java @@ -0,0 +1,34 @@ +package code; + +import java.util.List; +/* + * 120. Triangle + * 题意:三角形的矩阵,求值最小的路径 + * 难度:Medium + * 分类:Array, Dynamic Porgramming + * 思路:动态规划 dp[i] = min(dp[i-1],dp[i]) + val + * Tips: + */ +public class lc120 { + public int minimumTotal(List> triangle) { + int len = triangle.get(triangle.size()-1).size(); + int[] dp = new int[len]; + int[] dp2 = new int[len]; + int index = 0; + int res = Integer.MAX_VALUE; + while(index ls = triangle.get(index); + res = Integer.MAX_VALUE; + for (int i = 0; i < ls.size() ; i++) { + if(i==0) dp2[i] = dp[i] + ls.get(i); + else if(i==ls.size()-1) dp2[i] = dp[i-1] + ls.get(i); //注意是 i==ls.size()-1 + else dp2[i] = Math.min(dp[i-1],dp[i]) + ls.get(i); + res = Math.min(dp2[i], res); + } + dp = dp2; //两个一维数组 + dp2 = new int[len]; + index++; + } + return res; + } +} diff --git a/code/lc213.java b/code/lc213.java new file mode 100644 index 0000000..4a22123 --- /dev/null +++ b/code/lc213.java @@ -0,0 +1,38 @@ +package code; + +import java.util.Arrays; +/* + * 213. House Robber II + * 题意:数组最大和,不能选取相邻的两个数。数组首尾是连着的 + * 难度:Medium + * 分类:Dynamic Programming + * 思路:分别把第一个元素置0和最后一个元素置0,用lc198的解法 + * + * Tips:lc198 + */ +public class lc213 { + public int rob(int[] nums) { //分别把第一个元素置0和最后一个元素置0,用lc198的解法 + if(nums.length == 0) + return 0; + if(nums.length == 1) + return nums[0]; + int res1 = helper(Arrays.copyOf(nums, nums.length-1)); + nums[0] = 0; + int res2 = helper(nums); + return Math.max(res1, res2); + } + + public int helper(int[] nums) { + if(nums.length == 0) + return 0; + if(nums.length == 1) + return nums[0]; + int[] dp = new int[nums.length]; + dp[0] = nums[0]; + dp[1] = Math.max(nums[0], nums[1]); + for (int i = 2; i < nums.length ; i++) { + dp[i] = Math.max((dp[i-2] + nums[i]),dp[i-1]); //dp[i] 表示以 0~i 的数组的结果 + } + return dp[nums.length-1]; + } +} -- GitLab