1
1
# Time: O(m * 2^n)
2
2
# Space: O(2^n)
3
3
4
- # bitmasks, constructive algorithms, greedy, submask enumeration
5
- class Solution (object ):
6
- def goodSubsetofBinaryMatrix (self , grid ):
7
- """
8
- :type grid: List[List[int]]
9
- :rtype: List[int]
10
- """
11
- lookup = {}
12
- for i in xrange (len (grid )):
13
- mask = reduce (lambda mask , j : mask | (grid [i ][j ]<< j ), xrange (len (grid [0 ])), 0 )
14
- if not mask :
15
- return [i ]
16
- mask2 = ((1 << len (grid [0 ]))- 1 )^ mask
17
- submask = mask2 # submask enumeration
18
- while submask > 0 :
19
- if submask in lookup :
20
- return [lookup [submask ], i ]
21
- submask = (submask - 1 )& mask2
22
- lookup [mask ] = i
23
- return []
24
-
25
-
26
- # Time: O(m * 2^n)
27
- # Space: O(2^n)
28
4
# bitmasks, constructive algorithms, greedy
29
- class Solution2 (object ):
5
+ class Solution (object ):
30
6
def goodSubsetofBinaryMatrix (self , grid ):
31
7
"""
32
8
:type grid: List[List[int]]
@@ -37,10 +13,8 @@ def goodSubsetofBinaryMatrix(self, grid):
37
13
mask = reduce (lambda mask , j : mask | (grid [i ][j ]<< j ), xrange (len (grid [0 ])), 0 )
38
14
if not mask :
39
15
return [i ]
40
- for mask2 in xrange (1 , 1 << len (grid [0 ])):
41
- if mask & mask2 :
42
- continue
43
- if mask2 in lookup :
44
- return [lookup [mask2 ], i ]
16
+ for mask2 , j in lookup .iteritems ():
17
+ if mask & mask2 == 0 :
18
+ return [j , i ]
45
19
lookup [mask ] = i
46
20
return []
0 commit comments