子集问题(SubSet)

问题描述

给定一个含不同整数的集合,返回其所有的子集。

样例

样例1

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

样例2

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

挑战

采用递归和非递归两种方式求解

代码

下列代码包括递归和非递归两种解法

import org.omg.PortableInterceptor.SUCCESSFUL;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class SubSet {
    /**
     * @param nums: A set of numbers
     * @return: A list of lists
     */
    public List<List<Integer>> subsets(int[] nums) {    //递归解法
        // write your code here
        List<List<Integer>> res = new ArrayList<>();
        Arrays.sort(nums);
        List<Integer> ls = new ArrayList<>();
        dfs(res, ls, 0, nums.length, nums);
        return res;
    }
    private void dfs(List<List<Integer>> res, List<Integer> ls, int k, int m, int[] nums) {
        if (k == m) {
            res.add(new ArrayList<>(ls));
            return;
        }
        ls.add(nums[k]);      //要选
        dfs(res, ls, k+1, m, nums);

        ls.remove((Integer) nums[k]);  //不选,把int型转变为Integer对象
        dfs(res, ls, k+1, m, nums);
    }

    public List<List<Integer>> BFS(int[] nums) {  //非递归解法
        if (nums == null)
            return new ArrayList<>();
        List<List<Integer>> queen = new ArrayList<>();
        int index = 0;

        queen.add(new ArrayList<>());
        while (index < queen.size()) {
            List<Integer> subset = queen.get(index++);
            for (int i = 0; i < nums.length; i++) {
                if (subset.size() != 0 && subset.get(subset.size() -1) >= nums[i]) //顺序不可反
                    continue;

                List<Integer> newSubset = new ArrayList<>(subset);
                newSubset.add(nums[i]);
                queen.add(newSubset);
            }
        }
        return queen;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值