leetcode:78. 子集(java,位运算,深搜dfs)

给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: nums = [1,2,3]
输出:
[
  [3],
  [1],
  [2],
  [1,2,3],
  [1,3],
  [2,3],
  [1,2],
  []
]

第一种是按位运算排名不是很理想

 public List> subsetswei(int[] nums) {
        List> res = new ArrayList<>();
        if (nums.length == 0) return res;
        //二进制最大的数
        int max = (int) Math.pow(2, nums.length);
        //每一个进行循环比如是三位也就是1-7循环看看是哪一位二进制七位
        for (int i = 1; i < max; i++) {
            //为了循环中判断二进制中哪一位是1
            int m = 1;
            List rr = new ArrayList<>();
            for (int j = 0; j < nums.length; j++) {
                if ((i & m) != 0) {
                    rr.add(nums[j]);
                }
                m = m << 1;
            }
            res.add(new ArrayList(rr));
        }
        return res;
    }

第二种是dfs比较理想

 public List> subsets(int[] nums) {
        List> res = new ArrayList<>();
        if (nums.length == 0) return res;
        res.add(new ArrayList());
        dfs(0, nums, res, new ArrayList());
        return res;
    }

    public void dfs(int indx, int[] nums, List> res, List rr) {
        for (int i = indx; i (rr));
            //继续下一个数字
            dfs(i+1,nums,res,rr);
            rr.remove(rr.size()-1);
        }
    }

 

你可能感兴趣的:(算法试题(java))