File tree Expand file tree Collapse file tree 1 file changed +52
-0
lines changed Expand file tree Collapse file tree 1 file changed +52
-0
lines changed Original file line number Diff line number Diff line change 1+ /**
2+ * @param {number[] } nums
3+ * @return {boolean }
4+ */
5+ let canPartition = function ( nums ) {
6+ let sum = nums . reduce ( ( a , b ) => a + b ) ;
7+
8+ let target = sum / 2 ;
9+ if ( Math . ceil ( target ) !== target ) {
10+ return false ;
11+ }
12+
13+ let n = nums . length ;
14+ let dp = new Array ( n ) ;
15+ for ( let i = 0 ; i < dp . length ; i ++ ) {
16+ dp [ i ] = new Array ( target + 1 ) . fill ( false ) ;
17+ }
18+
19+ for ( let j = 0 ; j <= target ; j ++ ) {
20+ dp [ 0 ] [ j ] = nums [ 0 ] === target ? true : false ;
21+ }
22+
23+ for ( let i = 0 ; i < dp . length ; i ++ ) {
24+ dp [ i ] [ 0 ] = true ;
25+ }
26+
27+ for ( let i = 1 ; i < dp . length ; i ++ ) {
28+ for ( let j = 0 ; j <= target ; j ++ ) {
29+ let num = nums [ i ] ;
30+
31+ let pick = dp [ i - 1 ] [ j - num ] || false ;
32+ let notPick = dp [ i - 1 ] [ j ] || false ;
33+
34+ let result = pick || notPick ;
35+ dp [ i ] [ j ] = result ;
36+
37+ if ( j == target && result ) {
38+ return true ;
39+ }
40+ }
41+ }
42+
43+ return dp [ n - 1 ] [ target ] ;
44+ } ;
45+
46+ console . log ( canPartition ( [ 1 , 2 , 3 , 5 ] ) ) ;
47+
48+ /**
49+ * 这个问题的思路在于,先把数组之和除以二,记为target。只要任意组合的子数组能凑成target,也就说明剩下的一定也能凑成target。
50+ * 1. 除以二后有小数点的直接失败,因为一定不可能是两个整数子数组相凑的结果。
51+ * 2. 只要用任意数量的子数组可以拼凑出来target的值,也就是dp数组的任意一层的最右边的值计算出是true,那么整题的结果就为true。因为不论你用几个值凑出了target值,哪怕只用了一个值。另外剩下的值之和一定也是target。
52+ */
You can’t perform that action at this time.
0 commit comments