美文网首页
78. 子集

78. 子集

作者: 梦想黑客 | 来源:发表于2020-03-03 17:16 被阅读0次

题目描述

给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。

说明:解集不能包含重复的子集。

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

解法一

class Solution {
    public List<List<Integer>> subsets(int[] nums) {
        //位运算,
         /**
         * 0001 A
         * 0010 B
         * 0011 AB
         * 0100 C
         * 0101 AC
         * 0110 BC
         * 0111 ABC
         * 1000 []
         */

        List<List<Integer>> result = new ArrayList<>();

        int size = 1 << nums.length;
        for(int i = 0; i < size; i++){
            
            List<Integer> item = new ArrayList<>();
            for(int j = 0; j < nums.length; j++){

                if( ((i >> j) & 1) == 1 ){
                    item.add(nums[j]);
                }
            }
            result.add(item);
        }
        


        return result;
    }

   
}

解法二

class Solution {
    
    List<List<Integer>> result = new ArrayList<>();
    
    public List<List<Integer>> subsets(int[] nums) {
        if(nums == null || nums.length == 0) return result;
        
        List<Integer> list = new ArrayList<Integer>();
        result.add(new ArrayList<>(list));   //添加空集
        
        generate(list,nums,0);
        
        return result;    
    }
    
    private void generate(List<Integer> list,int[] nums,int start){
        
        for(int i = start; i < nums.length; i++){
            list.add(nums[i]);
            result.add(new ArrayList<>(list));
            generate(list,nums,i+1);
            list.remove(list.size() -1);
        }
    }
}

解法三

class Solution {
    public List<List<Integer>> subsets(int[] nums) {
        //回溯法,每个数字出现或者不出现
        //[[], [1], [1, 2], [1, 2, 3], [1, 3], [2], [2, 3], [3]]

        List<List<Integer>> result = new ArrayList<>();

        List<Integer> item = new ArrayList<>(); //添加空集
        result.add(new ArrayList<Integer>(item));   //添加到result的时候需要复制集合,因为Java保存的是引用

        generate(0, nums, item, result);
        return result;
    }

    private void generate(int i, int[] nums, List<Integer> item, List<List<Integer>> result) {
        if (i >= nums.length) return;

        item.add(nums[i]);
        result.add(new ArrayList<Integer>(item));   //出现
        generate(i + 1, nums, item, result);

        item.remove(item.size() - 1);   //不出现
        generate(i + 1, nums, item, result);
    }
}

相关文章

  • LeetCode-78-子集

    LeetCode-78-子集 78. 子集[https://leetcode-cn.com/problems/su...

  • LeetCodeDay53 —— 子集★★

    78. 子集 Subsets 描述 Given a set of distinct integers, nums,...

  • 回溯递归算法

    回溯大法严重依赖【递归】 1、求子集 78. 子集[https://leetcode-cn.com/problem...

  • 子集 + 子集 II AND 零花钱兑换 + 零钱兑换 II

    78. 子集[https://leetcode-cn.com/problems/subsets/] 方法一 枚举 ...

  • 78.子集

    题目给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。 说明:解集不能包含重复的子集。 ...

  • 78.子集

    代码解答 思路解析 读题分析应该用递归,第一个数与剩余数组合,第二个数与排除第一个数后剩余数组合...到达边界后返...

  • 78. 子集

    题目描述 给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。 说明:解集不能包含重复的子...

  • 78. 子集

    给定一组不含重复元素的整数数组nums,返回该数组所有可能的子集(幂集)。 说明:解集不能包含重复的子集。 示例:...

  • 78. 子集

    很经典的回溯问题,每一次的递归结束后,return。会继续执行removelast语句先存起来,在此基础上实现子集的遍历

  • 78. 子集

    (不同的整数,返回所有可能的子集,离散数学中叫power set)

网友评论

      本文标题:78. 子集

      本文链接:https://www.haomeiwen.com/subject/gmnhlhtx.html