<span>NC27 集合的所有子集(一)</span>

1.题目

描述

现在有一个没有重复元素的整数集合S,求S的所有子集
注意:
你给出的子集中的元素必须按升序排列

给出的解集中不能出现重复的元素

数据范围:1≤n≤5,集合中的任意元素满足∣val∣≤10

要求:空间复杂度 O(n!),时间复杂度 O(n!)

示例1

输入:

[1,2,3]

返回值:

[[],[1],[2],[3],[1,2],[1,3],[2,3],[1,2,3]]

示例2

输入:

[]

复制

[]

2. 题解


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

public class S76 {
    static ArrayList<ArrayList<Integer>> result = new ArrayList<>();

    /**
     * 该递归函数完成后,result中是: 在 arr 中 选择k个数字的全部组合(无重复)。
     * 例如arr[]={1,2,3} 那么当backtracking(2,0,new ArrayList(),arr) 调用返回后  result={{1,2},{1,3},{2,3}};
     *
     * @param k     选择k个数字的组合
     * @param start 从数组的 start位置 开始
     * @param list  一个组合
     * @param arr   原数组
     */
    public static void backtracking(int k, int start, List<Integer> list, int[] arr) {
        if (k < 0)
            return;
        else if (k == 0) {
            //k==0表示已经找到了k个数字的组合,这时候加入全局result中
            result.add(new ArrayList(list));
        } else {
            for (int i = start; i < arr.length; i++) {
                list.add(arr[i]);
                //上一行代码选择了一个数字 , 接着对于剩余数字 做组合。 k-1 表示接下来少选一个数,i+1表示 从数组的i+1开始
                backtracking(k - 1, i + 1, list, arr);
                // 去掉 arr[i] , 下一轮循环跳过这个数。 数组内每一个元素 都有两种状态:选或者不选。
                list.remove(list.size() - 1);
            }
        }
    }

    /**
     * 循环执行 backtracking 选择有 0 ,1 ,2, 3.....arr.length 个元素的组合 ,就构成了arr的所有子集(无重复)
     */
    public static ArrayList<ArrayList<Integer>> subsets(int[] S) {
        for (int i = 0; i <= S.length; i++) {
            //选择i个数的组合
            backtracking(i, 0, new ArrayList<>(), S);
        }
        return result;
    }

    public static void main(String[] args) {
        int[] ints = {1, 2, 3, 4};
        subsets(ints);
    }
}

全部评论

相关推荐

26牛牛不会梦到感谢信:羡慕离职了还能吃吗现在就赶回去
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
# 听劝,这个简历怎么改 #
14064次浏览 182人参与
# 面试被问“你的缺点是什么?”怎么答 #
6244次浏览 98人参与
# 水滴春招 #
16176次浏览 330人参与
# 入职第四天,心情怎么样 #
11265次浏览 63人参与
# 租房找室友 #
7997次浏览 53人参与
# 读研or工作,哪个性价比更高? #
26139次浏览 356人参与
# 职场新人生存指南 #
199165次浏览 5506人参与
# 参加完秋招的机械人,还参加春招吗? #
26941次浏览 276人参与
# 文科生还参加今年的春招吗 #
4101次浏览 31人参与
# 简历无回复,你会继续海投还是优化再投? #
48608次浏览 561人参与
# 你见过最离谱的招聘要求是什么? #
144708次浏览 829人参与
# 如果重来一次你还会读研吗 #
155712次浏览 1706人参与
# 机械人选offer,最看重什么? #
69076次浏览 449人参与
# 选择和努力,哪个更重要? #
44261次浏览 492人参与
# 如果再来一次,你还会学硬件吗 #
103638次浏览 1245人参与
# 如果你有一天可以担任公司的CEO,你会做哪三件事? #
20517次浏览 413人参与
# 招聘要求与实际实习内容不符怎么办 #
46662次浏览 494人参与
# 22届毕业,是读研还是拿外包offer先苟着 #
4652次浏览 27人参与
# 你们的毕业论文什么进度了 #
901179次浏览 8960人参与
# 软开人,你觉得应届生多少薪资才算合理? #
81368次浏览 496人参与
# 国企还是互联网,你怎么选? #
109188次浏览 853人参与
牛客网
牛客企业服务