Leetcode 78: Subsets

78. Subsets

 
  • Total Accepted: 118197
  • Total Submissions: 341929
  • Difficulty: Medium

Given a set of distinct integers, nums, return all possible subsets.

Note: The solution set must not contain duplicate subsets.

For example,
If nums = [1,2,3], a solution is:

[
  [3],
  [1],
  [2],
  [1,2,3],
  [1,3],
  [2,3],
  [1,2],
  []
]

Subscribe to see which companies asked this question

 

Code (Bit manipulation)

class Solution(object):
    def subsets(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        ss_num = 2 ** len(nums)
        ss = [[] for i in xrange(ss_num)]

        for i in xrange(ss_num):
            k = i
            for j in xrange(len(nums)):
                if k & 1:
                    ss[i].append(nums[j])
                k = k >> 1
        return ss
                

 

Idea

There should be $latex 2^len(nums)$ subsets. So you can construct binary numbers from 0…0 to 1…1. For each binary number, its every bit indicates whether to includes a number in `nums`. 

 

Code (DFS)

class Solution(object):
    def subsets(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        res = []
        self.dfs(nums, 0, [], res)
        return res
    
    def dfs(self, nums, start_idx, path, res):
        res.append(path)
        for i in xrange(start_idx, len(nums)):
            self.dfs(nums, i+1, path + [nums[i]], res)                

 

Idea

Try to build a directed graph in which node x connects to node y (y > x). For example, if the given set is [0,1,2,3,4], then:
node 0 is connected to node 1, 2, 3, 4
node 1 is connected to node 2,3,4
node 2 is connected to node 3,4
node 3 is connected to node 4

Then you do dfs. At the moment of visiting each node, you add the traced path to result.

 

Leave a comment

Your email address will not be published. Required fields are marked *