提交 051dfbf2 编写于 作者: L liu13

20190312

上级 5d8c4599
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<List<Integer>> 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<triangle.size()){
List<Integer> 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;
}
}
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];
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册