File tree Expand file tree Collapse file tree 2 files changed +72
-0
lines changed
Expand file tree Collapse file tree 2 files changed +72
-0
lines changed Original file line number Diff line number Diff line change 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+ }
Original file line number Diff line number Diff line change 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+ }
You can’t perform that action at this time.
0 commit comments