File tree 2 files changed +72
-0
lines changed
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