`

Subsets

阅读更多
Given a set of distinct integers, nums, return all possible subsets.

Note:
Elements in a subset must be in non-descending order.
The solution set must not contain duplicate subsets.
For example,
If nums = [1,2,3], a solution is:

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

求子集问题,最直接的办法是用回溯法,假设一共有n个元素,子集的个数为2^n个,找出长度length从0到n的所有的可能的组合,回溯的条件根据当前的length来决定。代码如下:
public class Solution {
    public List<List<Integer>> subsets(int[] nums) {
        LinkedList<Integer> list = new LinkedList<Integer>();
        List<List<Integer>> llist = new LinkedList<List<Integer>>();
        if(nums == null || nums.length == 0) return llist;
        java.util.Arrays.sort(nums);
        for(int lth = 0; lth <= nums.length; lth++) {
            getSubsets(0, lth, nums, list, llist);
        }
        return llist;
    }
    public void getSubsets(int start, int lth, int[] nums, LinkedList<Integer> list, List<List<Integer>> llist) {
        if(list.size() == lth) {
            llist.add(new LinkedList<Integer>(list));
            return;
        }
        for(int i = start; i < nums.length; i++) {
            list.add(nums[i]);
            getSubsets(i + 1, lth, nums, list, llist);
            list.removeLast();
        }
    }
}


还有一种很巧妙的方法,用位运算的方法来解决。长度为n的数组num[],它的子集的个数为2^n个,假设第i个子集,我们如何用位运算得到它呢?我们可以将i依次右移0到n次,每次都与1位与,如果结果为1,假设位移了k位,那么就把数组中第k个元素nums[k]加入结果中。这样正好可以找到数组中所有的子集。代码如下:
public class Solution {
    public List<List<Integer>> subsets(int[] nums) {
        List<Integer> list;
        List<List<Integer>> llist = new ArrayList<List<Integer>>();
        if(nums == null || nums.length == 0) return llist;
        java.util.Arrays.sort(nums);
        for(int i = 0; i < Math.pow(2, nums.length); i++) {
            list = new ArrayList<Integer>();
            for(int j = 0; j < nums.length; j++) {
                if((i >> j & 1) == 1)
                    list.add(nums[j]);
            }
            llist.add(list);
        }
        return llist;
    }
}
0
0
分享到:
评论

相关推荐

    python-leetcode题解之090-Subsets-II

    本文的重点是解决 LeetCode 上的一道题——Subsets-II(编号090)。该题要求编写一个函数,找出给定数组的所有可能的子集,并返回这些子集。这个问题是组合数学中的一个经典问题,在面试中也经常出现。解决这类问题...

    js-leetcode题解之78-subsets.js

    其中,78号题目——subsets 是一道经典的算法题目,要求解题者输出给定数组的所有可能的子集。 subsets 题目描述的是一个典型的回溯算法问题,涉及到组合数学的集合论知识。对于给定的非负整数数组,需要编写一个...

    C语言-leetcode题解之78-subsets.c

    其中的子集问题(subsets)是一个经典的算法问题,通常用于考察数据结构中集合操作的理解与实现能力。 子集问题的一般描述是这样的:给定一个整数数组,输出该数组所有可能的子集。子集中的元素不考虑顺序,但每个...

    c语言-leetcode题解之0090-subsets-ii.zip

    本压缩包文件“c语言-leetcode题解之0090-subsets-ii.zip”即为一套使用 C 语言编写的题解,针对 LeetCode 上的一道特定题目:“Subsets II”(编号为0090)。这个题目的核心是解决子集问题,且需要处理含有重复元素...

    c语言-leetcode题解之0078-subsets.zip

    子集问题(Subsets)是其中的一个经典问题,通常编号为0078。在该问题中,给定一组不包含重复元素的整数数组,要求编写一个函数,返回这组数字的所有可能的子集。子集问题可以视为组合问题的变种,是组合数学中的一...

    java-leetcode题解之Partition to K Equal Sum Subsets.java

    3. 题目背景知识: Partition to K Equal Sum Subsets,即划分成K个相等子集问题,要求给定一个整数数组,判断是否能够将数组中的数字划分为K个非空子集,并且每个子集的和相等。这是典型的NP完全问题,其解法需要...

    python-leetcode题解之078-Subsets

    python python_leetcode题解之078_Subsets

    On super weak compactness of subsets and its equivalences in Banach spaces

    关于Banach空间中的超弱紧子集和其等价性,程立新,程庆进,类比于Banach空间中的弱紧集和超自反空间中子集的性质,本文目的是讨论Banach空间中凸和非凸子集的超弱紧性质。作为结果,本文给出了超�

    subsets:在c c ++ python中,集合的子集变为ruby。 信息竞技场

    标题中的"subsets"指的是集合的子集概念,这在编程中是一个常见的数学问题,特别是在算法和数据结构的学习中。子集是指一个集合中的所有可能的不重复元素组合。例如,如果集合是{1, 2, 3},它的子集包括空集、{1}、{...

    subsets:用于子集字体的字符列表

    标题提到的"subsets:用于子集字体的字符列表"是针对字体文件的一种处理方式,旨在提高性能和减小文件大小。当你只需要字体文件中的部分字符(比如特定语言的字母或符号)时,可以创建一个包含这些字符的子集,而不是...

    train-all-subsets.py

    用于训练所有子集的python脚本

    klass-subsets-client:类子集Web应用

    分类子集Web应用程序 目录 国际化 会话存储 错误处理 快取 基本文件结构 后端 部署方式本地主机 配置React脚本 整合与依存关系 ... GET /subsets GET /subsets/{subsetId}/ GET /subsets/{subsetId}/vers

    On uniformly convex subsets of Banach spaces

    本文讨论了Banach空间中的一致凸子集,并详细阐述了这一概念的相关性质。Banach空间是由波兰数学家斯特凡·Banach提出的一类完备的赋范向量空间,是泛函分析中的核心概念之一。在Banach空间理论中,一致凸性是判断...

    js-leetcode题解之90-subsets-II.js

    在JavaScript中解决LeetCode问题库中的第90题——子集II,是一个典型的回溯算法问题。该问题要求给定一个可能包含重复元素的整数数组,返回该数组所有可能的子集。解决这个问题的关键在于,如何避免在子集的生成过程...

    subsets:https

    var subsets = require ( 'subsets' ) ; var checks = 0 ; var sets = subsets ( [ 1 , 10 , 4 , 25 , 26 , 6 ] , function ( a , b ) { checks ++ ; return Math . abs ( a - b ) &lt;= 3 ; } ) ; console . log ...

    SubSets:SubSets(m,n) 返回一个 n 成员集的所有 m 维子集。-matlab开发

    %SubSets SubSets(m,n) 返回一个 n 成员集的所有 m 维子集。 % Subsets(m,n,k) 从第 k 个成员开始。 % 这个例程递归地工作。 结果按列排列% 在矩阵中。

    基于Matlab实现和相等的两个不相交子集【100010599】

    function recursion(numbers, currentSet, index, subsets, n, matchSet) if sum(currentSet) == sum(matchSet) && isequal(sort(currentSet), sort(matchSet)) subsets{end+1} = {currentSet, matchSet}; return...

    数据结构实验 子集

    new_subsets = [[num] + subset for subset in subsets for num in nums] return subsets + new_subsets nums = [1, 2, 3] print(generate_subsets(nums)) ``` 这个函数首先检查输入的集合是否为空。如果不为空...

    wgrib_v2.0.7

    create regional subsets by cookie cutter or projections export to ieee, text, binary, CSV, netcdf and mysql write of new grib2 fields parallel processing by using threads (OpenMP) parallel processing ...

    wgrib2.tgz.v2.0.8

    Some functionality include, inventory and rea d grib2 files create subsets create regional subsets by cookie cutter or projections export to ieee, text, binary, CSV, netcdf and mysql write of new ...

Global site tag (gtag.js) - Google Analytics