LeetCode-【数组】-子集

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zw159357/article/details/81217773

给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。

说明:解集不能包含重复的子集。

示例:

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

分析:由于题目要求要列出所有的结果,所以我们很容易想到深搜法来遍历所有的情况,但当面对数据量大的题目,深搜算法并没有那么好用,本题也可从另一个角度看待这个问题,对[1,2,3]来说,首先是[],然后遇到1,这时可以把[1]看成1和[]的合成形成[1],然后再遇到2,形成的序列有[2]、[1,2]。依次类推,可以形成的序列还有,[3]、[2,3]、[1,2,3]。这样就算出所有的序列了。

深搜:

class Solution {
    public List<List<Integer>> subsets(int[] nums) {
        List<List<Integer>> res=new ArrayList<>();
        dfs(res,new ArrayList<Integer>(),nums,0);
        return res;
    }
    public static void dfs(List<List<Integer>> res,List<Integer> tmp,int[] nums,int start){
        res.add(new ArrayList<Integer>(tmp));
        for(int i=start;i<nums.length;i++){
            tmp.add(nums[i]);
            dfs(res,tmp,nums,i+1);
            tmp.remove(tmp.size()-1);
        }
    }
}

直接计算:

class Solution {
    public List<List<Integer>> subsets(int[] nums) {
        List<List<Integer>> res=new ArrayList<>();
        List<Integer> tmp=new ArrayList<>();
        res.add(tmp);
        int l=0;
        for(int i=0;i<nums.length;i++){
            l=res.size();
            for(int j=0;j<l;j++){
                tmp=new ArrayList<>(res.get(j));
                tmp.add(nums[i]);
                res.add(tmp);
            }
        }
        return res;
    }
}

猜你喜欢

转载自blog.csdn.net/zw159357/article/details/81217773