PU Subsets

Jan 01, 1970

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],
  []
]

Python Solution 1:

class Solution(object):
    def subsets(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        if not nums: return []
        def recu(nums, pos, cur, res):
            if pos == len(nums):
                res.append(cur[:])
                return
            recu(nums, pos + 1, cur, res)
            cur.append(nums[pos])
            recu(nums, pos + 1, cur, res)
            cur.pop()
        res = []
        recu(nums, 0, [], res)
        return res

Python Solution 2:

class Solution(object):
    def subsets(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        res = []
        cur = []
        def recu(nums):
            if not nums:
                res.append(cur[:])
                return
            num = nums.pop()
            recu(nums)
            cur.append(num)
            recu(nums)
            cur.pop()
            nums.add(num)
        recu(set(nums))
        return res

Python Solution 3:

class Solution(object):
    def subsets(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        res = []
        cur = []
        def recu(nums, ind):
            if ind == len(nums):
                res.append(cur[:])
                return
            recu(nums, ind + 1)
            cur.append(nums[ind])
            recu(nums, ind + 1)
            cur.pop()
        recu(nums, 0)
        return res

C Solution 1:

/**
 * Return an array of arrays of size *returnSize.
 * The sizes of the arrays are returned as *columnSizes array.
 * Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
 */
void recu(int *nums, int numsSize, int **res, int *cs, int *returnSize, int *cur, int len) {
    if (!numsSize) {
        res[*returnSize] = malloc(len * sizeof(int));
        memcpy(res[*returnSize], cur, len * sizeof(int));
        cs[*returnSize] = len;
        ++*returnSize;
        return;
    }
    cur[len++] = nums[0];
    recu(nums + 1, numsSize - 1, res, cs, returnSize, cur, len);
    len--;
    recu(nums + 1, numsSize - 1, res, cs, returnSize, cur, len);
}
int** subsets(int* nums, int numsSize, int** columnSizes, int* returnSize) {
    *returnSize = 1 << numsSize;
    int **res = malloc(*returnSize * sizeof(int *));
    *columnSizes = malloc(*returnSize * sizeof(int));
    int *cur = malloc(numsSize * sizeof(int));
    *returnSize = 0;
    recu(nums, numsSize, res, *columnSizes, returnSize, cur, 0);
    free(cur);
    return res;
}

C Solution 2:

/**
 * Return an array of arrays of size *returnSize.
 * The sizes of the arrays are returned as *columnSizes array.
 * Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
 */
int** subsets(int* nums, int numsSize, int** columnSizes, int* returnSize) {
    *returnSize = 1 << numsSize;
    int **res = malloc(*returnSize * sizeof(int *));
    *columnSizes = calloc(*returnSize, sizeof(int));
    int j;
    for (j = 0; j < *returnSize; j++) res[j] = malloc(j * sizeof(int));
    int *mask = malloc(numsSize * sizeof(int));
    mask[0] = 1;
    int i;
    for (i = 1; i < numsSize; i++) mask[i] = mask[i - 1] << 1;
    for (i = 0; i < numsSize; i++) {
        for (j = 0; j < *returnSize; j++) {
            if (j & mask[i]) res[j][((*columnSizes)[j])++] = nums[i];
        }
    }
    return res;
}

Summary:

  • The current solution is different from the privious one. Try Again.

LeetCode: 78. Subsets