@@ -3,6 +3,23 @@ class Solution:
3
3
# Time: O(n * sum)
4
4
# Space: O(sum)
5
5
def can_partition (self , nums : list [int ]) -> bool :
6
+ """
7
+ Example: nums = [1, 5, 11, 5], target = 11
8
+
9
+ Initial: dp = [T, F, F, F, F, F, F, F, F, F, F, F]
10
+ 0 1 2 3 4 5 6 7 8 9 10 11
11
+
12
+ After num=1: [T, T, F, F, F, F, F, F, F, F, F, F]
13
+ └─┘ (can make sum 1)
14
+
15
+ After num=5: [T, T, F, F, F, T, T, F, F, F, F, F]
16
+ └─┘ └─┘ └─┘ (can make sums 5,6)
17
+
18
+ After num=11:[T, T, F, F, F, T, T, F, F, F, F, T]
19
+ └─┘ (target!)
20
+
21
+ Backward iteration prevents using same number twice
22
+ """
6
23
total = sum (nums )
7
24
if total % 2 :
8
25
return False
@@ -20,3 +37,57 @@ def can_partition(self, nums: list[int]) -> bool:
20
37
return True
21
38
22
39
return False
40
+
41
+
42
+ class SolutionBitset :
43
+ # Time: O(n * sum)
44
+ # Space: O(1)
45
+ def can_partition (self , nums : list [int ]) -> bool :
46
+ """
47
+ Example: nums = [1, 5, 11, 5], target = 11
48
+
49
+ Bitset representation (bit position = achievable sum):
50
+
51
+ Initial: dp = 1 (binary: 1)
52
+ Bits: ...0001
53
+ Sums: {0}
54
+
55
+ After num=1: dp |= dp << 1
56
+ a = dp = 1 (bin: 0001)
57
+ b = dp << 1 = 2 (bin: 0010)
58
+ c = a | b = 3 (bin: 0011)
59
+ Sums: {0, 1}
60
+
61
+ After num=5: dp |= dp << 5
62
+ a = dp = 3 (bin: 0000011)
63
+ b = dp << 5 = 96 (bin: 1100000)
64
+ c = a | b = 99 (bin: 1100011)
65
+ Sums: {0, 1, 5, 6}
66
+
67
+ After num=11: dp |= dp << 11
68
+ a = dp = 99 (bin: 00000001100011)
69
+ b = dp << 11 = 202752 (bin: 110001100000000)
70
+ c = a | b = 202851 (bin: 110001101100011)
71
+ Sums: {0, 1, 5, 6, 11, 12, 16, 17}
72
+
73
+ Check: (dp & (1 << 11)) != 0
74
+ a = dp = 202851 (bin: 110001101100011)
75
+ b = 1 << 11 = 2048 (bin: 100000000000)
76
+ c = a & b = 2048 (bin: 100000000000)
77
+ c != 0 → bit 11 is set → True!
78
+ """
79
+ total = sum (nums )
80
+ if total % 2 != 0 :
81
+ return False
82
+
83
+ target = total // 2
84
+ dp = 1
85
+
86
+ for num in nums :
87
+ dp |= dp << num
88
+
89
+ # Early termination: found target sum!
90
+ if (dp & (1 << target )) != 0 :
91
+ return True
92
+
93
+ return False
0 commit comments