题目描述

原题链接

给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。

示例 1:
输入:nums = [1,2,3]
输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]

示例 2:
输入:nums = [0]
输出:[[],[0]]

提示:

  • 1 <= nums.length <= 10
  • -10 <= nums[i] <= 10
  • nums 中的所有元素 互不相同

    个人解法

Javascript

Java

回溯

  1. class Solution {
  2. List<Integer> t = new ArrayList<Integer>();
  3. List<List<Integer>> ans = new ArrayList<List<Integer>>();
  4. public List<List<Integer>> subsets(int[] nums) {
  5. dfs(0, nums,nums.length,t);
  6. return ans;
  7. }
  8. public void dfs(int cur,int[] nums,int len,List<Integer> list){
  9. //记录答案,设置退出递归的条件
  10. if (cur==len){
  11. ans.add(new ArrayList<Integer>(list));
  12. return;
  13. }
  14. //考虑选择当前位置
  15. list.add(nums[cur]);
  16. dfs(cur+1,nums,len,list);
  17. //考虑不选择当前位置
  18. list.remove(list.size()-1);
  19. dfs(cur+1,nums,len,list);
  20. }
  21. }

其他解法

Java

题解连接

迭代法

  1. class Solution {
  2. List<Integer> t = new ArrayList<Integer>();
  3. List<List<Integer>> ans = new ArrayList<List<Integer>>();
  4. public List<List<Integer>> subsets(int[] nums) {
  5. int n = nums.length;
  6. for (int mask = 0; mask < (1 << n); ++mask) {
  7. t.clear();
  8. for (int i = 0; i < n; ++i) {
  9. if ((mask & (1 << i)) != 0) {
  10. t.add(nums[i]);
  11. }
  12. }
  13. ans.add(new ArrayList<Integer>(t));
  14. }
  15. return ans;
  16. }
  17. }

Javascript

题解链接

迭代法

  1. /*
  2. * @lc app=leetcode.cn id=78 lang=javascript
  3. *
  4. * [78] 子集
  5. */
  6. // @lc code=start
  7. /**
  8. * @param {number[]} nums
  9. * @return {number[][]}
  10. */
  11. var subsets = function (nums) {
  12. const ans = [];
  13. const n = nums.length;
  14. for (let mask = 0; mask < (1 << n); ++mask) {
  15. const t = [];
  16. for (let i = 0; i < n; ++i) {
  17. if (mask & (1 << i)) {
  18. t.push(nums[i]);
  19. }
  20. }
  21. ans.push(t);
  22. }
  23. return ans;
  24. };
  25. // @lc code=end


回溯

  1. var subsets = function(nums) {
  2. const t = [];
  3. const ans = [];
  4. const n = nums.length;
  5. const dfs = (cur) => {
  6. if (cur === nums.length) {
  7. ans.push(t.slice());
  8. return;
  9. }
  10. t.push(nums[cur]);
  11. dfs(cur + 1, nums);
  12. t.pop(t.length - 1);
  13. dfs(cur + 1, nums);
  14. }
  15. dfs(0, nums);
  16. return ans;
  17. };