@@ -33,6 +33,39 @@ let robRecurision = function (nums) {
3333assert ( robRecurision ( [ 1 , 2 , 3 , 1 ] ) === 4 ) ;
3434assert ( robRecurision ( [ 2 , 7 , 9 , 3 , 1 ] ) === 12 ) ;
3535
36+ /**
37+ * 打家劫舍-递归版2
38+ * 把打劫细分为
39+ *
40+ * 1. 打劫当前房子 那么下次就要从start + 2开始
41+ * 2. 打劫下一个房子 那么就直接从start + 1开始
42+ *
43+ * 求这两者间的最大值
44+ * @param {* } nums
45+ */
46+ let robRecurision2 = function ( nums ) {
47+ let memo = [ ] ;
48+ function tryRob ( nums , start ) {
49+ let memorized = memo [ start ] ;
50+ if ( memorized ) return memorized ;
51+
52+ if ( start > nums . length - 1 ) return 0 ;
53+
54+ let robNow = nums [ start ] + tryRob ( nums , start + 2 ) ;
55+ let robNext = tryRob ( nums , start + 1 ) ;
56+
57+ let best = Math . max ( robNext , robNow ) ;
58+ memo [ start ] = best ;
59+
60+ return best ;
61+ }
62+
63+ return tryRob ( nums , 0 ) ;
64+ } ;
65+
66+ assert ( robRecurision2 ( [ 1 , 2 , 3 , 1 ] ) === 4 ) ;
67+ assert ( robRecurision2 ( [ 2 , 7 , 9 , 3 , 1 ] ) === 12 ) ;
68+
3669/**
3770 * 打家劫舍 DP版
3871 * @param {number[] } nums
@@ -58,3 +91,27 @@ let rob = function (nums) {
5891
5992assert ( rob ( [ 1 , 2 , 3 , 1 ] ) === 4 ) ;
6093assert ( rob ( [ 2 , 7 , 9 , 3 , 1 ] ) === 12 ) ;
94+
95+ /**
96+ * 打家劫舍 DP版2
97+ * @param {number[] } nums
98+ * @return {number }
99+ */
100+ let rob2 = function ( nums ) {
101+ if ( ! nums . length ) {
102+ return 0 ;
103+ }
104+ let dp = [ ] ;
105+
106+ for ( let i = nums . length - 1 ; i >= 0 ; i -- ) {
107+ let robNow = nums [ i ] + ( dp [ i + 2 ] || 0 )
108+ let robNext = dp [ i + 1 ] || 0
109+
110+ dp [ i ] = Math . max ( robNow , robNext )
111+ }
112+
113+ return dp [ 0 ] ;
114+ } ;
115+
116+
117+ console . log ( rob2 ( [ 1 , 10 , 3 , 1 , 5 ] ) ) ;
0 commit comments