LeetCode 78. Subsets

题目描述

Given a set of distinct integers, nums, return all possible subsets (the power set).

Note: The solution set must not contain duplicate subsets.

Example:

Input: nums = [1,2,3]
Output:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]

AC代码1

简单粗暴的方法。
比如输入是1,2。
初始化一个List< List< Integer>> resList,然后往里面添加一个空元素(ArrayList)。resList 的初始状态: [ [ ] ]
遍历resList里面的元素,先把这个当前元素加入resList,然后在这个元素里面加入1。resList的状态是 [ [ ] [ 1] ]。
接着遍历resList里面的元素,先把这个当前元素加入resList,然后在这个元素里面加入2。resList是 [ [ ] [ 1] [2] [1,2]]。
说不不好理解的话看代码吧。

public class _78Subsets {
    public List<List<Integer>> subsets(int[] nums) {
        List<List<Integer>> resList = new ArrayList<>();
        if(nums == null || nums.length == 0) return resList;
        resList.add(new ArrayList<>());
        for(int num : nums){
            int len = resList.size();
            for(int i = 0;i < len;i++){ //不可用语法糖遍历,也就是不可以用iterator,iterator便利的时候不可以执行add 和 delete等操作,只能用for循环取出每个元素的方式进行遍历
                resList.add(new ArrayList<>(resList.get(i)));
                resList.get(i).add(num);
            }
        }
        return resList;
    }

    //测试
    public static void main(String[] args) {
        int[] nums = new int[]{1,2};
        List<List<Integer>> resList = new _78Subsets().subsets(nums);
        for(List lists : resList){
            System.out.println(lists);
        }
    }
}

AC代码2

回溯法,迷宫之类的题目常用的方法,解法类似。

//回溯法
    public List<List<Integer>> subsets_2(int[] nums) {
        List<List<Integer>> list = new ArrayList<>();
        Arrays.sort(nums); //题目对顺序没有要求,所以没有必要
        backtrack(list, new ArrayList<>(), nums, 0);
        return list;
    }

    private void backtrack(List<List<Integer>> list , List<Integer> tempList, int [] nums, int start){
        list.add(new ArrayList<>(tempList));
        for(int i = start; i < nums.length; i++){ //以 i 打头的序列
            tempList.add(nums[i]);
            backtrack(list, tempList, nums, i + 1);
            tempList.remove(tempList.size() - 1);
        }
    }
点赞