Skip to content

Commit 051dfbf

Browse files
committed
20190312
1 parent 5d8c459 commit 051dfbf

File tree

2 files changed

+72
-0
lines changed

2 files changed

+72
-0
lines changed

code/lc120.java

+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package code;
2+
3+
import java.util.List;
4+
/*
5+
* 120. Triangle
6+
* 题意:三角形的矩阵,求值最小的路径
7+
* 难度:Medium
8+
* 分类:Array, Dynamic Porgramming
9+
* 思路:动态规划 dp[i] = min(dp[i-1],dp[i]) + val
10+
* Tips:
11+
*/
12+
public class lc120 {
13+
public int minimumTotal(List<List<Integer>> triangle) {
14+
int len = triangle.get(triangle.size()-1).size();
15+
int[] dp = new int[len];
16+
int[] dp2 = new int[len];
17+
int index = 0;
18+
int res = Integer.MAX_VALUE;
19+
while(index<triangle.size()){
20+
List<Integer> ls = triangle.get(index);
21+
res = Integer.MAX_VALUE;
22+
for (int i = 0; i < ls.size() ; i++) {
23+
if(i==0) dp2[i] = dp[i] + ls.get(i);
24+
else if(i==ls.size()-1) dp2[i] = dp[i-1] + ls.get(i); //注意是 i==ls.size()-1
25+
else dp2[i] = Math.min(dp[i-1],dp[i]) + ls.get(i);
26+
res = Math.min(dp2[i], res);
27+
}
28+
dp = dp2; //两个一维数组
29+
dp2 = new int[len];
30+
index++;
31+
}
32+
return res;
33+
}
34+
}

code/lc213.java

+38
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package code;
2+
3+
import java.util.Arrays;
4+
/*
5+
* 213. House Robber II
6+
* 题意:数组最大和,不能选取相邻的两个数。数组首尾是连着的
7+
* 难度:Medium
8+
* 分类:Dynamic Programming
9+
* 思路:分别把第一个元素置0和最后一个元素置0,用lc198的解法
10+
*
11+
* Tips:lc198
12+
*/
13+
public class lc213 {
14+
public int rob(int[] nums) { //分别把第一个元素置0和最后一个元素置0,用lc198的解法
15+
if(nums.length == 0)
16+
return 0;
17+
if(nums.length == 1)
18+
return nums[0];
19+
int res1 = helper(Arrays.copyOf(nums, nums.length-1));
20+
nums[0] = 0;
21+
int res2 = helper(nums);
22+
return Math.max(res1, res2);
23+
}
24+
25+
public int helper(int[] nums) {
26+
if(nums.length == 0)
27+
return 0;
28+
if(nums.length == 1)
29+
return nums[0];
30+
int[] dp = new int[nums.length];
31+
dp[0] = nums[0];
32+
dp[1] = Math.max(nums[0], nums[1]);
33+
for (int i = 2; i < nums.length ; i++) {
34+
dp[i] = Math.max((dp[i-2] + nums[i]),dp[i-1]); //dp[i] 表示以 0~i 的数组的结果
35+
}
36+
return dp[nums.length-1];
37+
}
38+
}

0 commit comments

Comments
 (0)