zoukankan      html  css  js  c++  java
  • 子集

    1.题目描述

    给你一个整数数组nums,返回该数组所有可能的子集(幂集)。解集不能包含重复的子集。
    示例 1:

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

    示例 2:

    输入:nums = [0]
    输出:[[],[0]]
    

    2.题解

    2.1 迭代法

    class Solution {
        List<Integer> t = new ArrayList<Integer>();
        List<List<Integer>> ans = new ArrayList<List<Integer>>();
    
        public List<List<Integer>> subsets(int[] nums) {
            int n = nums.length;
            for (int mask = 0; mask < (1 << n); ++mask) {
                t.clear();
                for (int i = 0; i < n; ++i) {
                    if ((mask & (1 << i)) != 0) {
                        t.add(nums[i]);
                    }
                }
                ans.add(new ArrayList<Integer>(t));
            }
            return ans;
        }
    }
    

    注意到这里1 << n1 << i都用了位运算的左移操作。

    nums = [1,2,3]为例:
    mask < (1 << n),即mask < 8
    mask & (1 << i),即mask & 001mask & 010mask & 100
    mask = 0时,mask & (1 << i)0,所以这里会向集合ans添加一个空的集合t
    mask = 1时,001 & 001 != 0,所以这里会向集合t添加一个nums[0]。注意,1左移0位为001
    mask = 3时,011 & 001 != 0011 & 010 != 0,所以这里会向集合t添加nums[1]nums[2]

    2.2 递归法

    class Solution {
        List<Integer> t = new ArrayList<Integer>();
        List<List<Integer>> ans = new ArrayList<List<Integer>>();
    
        public List<List<Integer>> subsets(int[] nums) {
            dfs(0, nums);
            return ans;
        }
    
        public void dfs(int cur, int[] nums) {
            if (cur == nums.length) {
                ans.add(new ArrayList<Integer>(t));
                return;
            }
            t.add(nums[cur]);
            dfs(cur + 1, nums);
            t.remove(t.size() - 1);
            dfs(cur + 1, nums);
        }
    }
    

    nums = [1,2,3]为例:

    dfs cur=0 t=1
          dfs cur=1 t=1,2
                dfs cur=2 t=1,2,3
                      dfs cur=3 添加[1,2,3]
                dfs cur=2 t=1,2
                      dfs cur=3 添加[1,2]
          dfs cur=1 t=1
                dfs cur=2 t=1,3
                      dfs cur=3 添加[1,3]
                dfs cur=2 t=1
                      dfs cur=3 添加[1]
    dfs cur=0 
          dfs cur=1 t=2
                dfs cur=2 t=2,3
                      dfs cur=3 添加[2,3]
                dfs cur=2 t=2
                      dfs cur=3 添加[2]
          dfs cur=1
                dfs cur=2 t=3
                      dfs cur=3 添加[3]
                dfs cur=2
                      dfs cur=3 添加[]
    

    注意,递归的边界条件为cur == nums.lengthcur是调用方法dfs时传入的,而不是集合t的元素个数。
    参考:

  • 相关阅读:
    微信小程序实现滚动到指定位置
    微信小程序,scroll-view组件的使用,跳转到指定的锚点/定位跳转
    小程序,报渲染层错误。图片无法渲染。
    input Input 输入判断/正则
    js,某元素在浏览器页面浮动/飘动
    前端模块化
    npx create-react-app命令不成功,更改成淘宝镜像
    深入理解jdk和jre(转)
    Java学习路线图·影响一代又一代程序员的经典书籍!(转)
    ZAB协议(转)
  • 原文地址:https://www.cnblogs.com/gzhjj/p/14260877.html
Copyright © 2011-2022 走看看