[leetcode][78] Subsets

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],
  []
]

解析

给定一个集合(集合中元素都不重复),找出其所有子集(包括空集和集合本身)。

参考答案(自己写的)

class Solution {
    public List<List<Integer>> subsets(int[] nums) {
        List<List<Integer>> res = new ArrayList<>();
        backtrack(nums, res, new ArrayList<>(), 0);
        return res;
    }

    public void backtrack(int[] nums, List<List<Integer>> lists, List<Integer> list, int start) {
        lists.add(new ArrayList<>(list));
        for (int i = start; i < nums.length; i++) {
            list.add(nums[i]);
            backtrack(nums, lists, list, i+1);
            list.remove(list.size() - 1);
        }
    }
}

此题采用回朔的方法,看看知乎上对回朔的讲解:

Backtracking就是简单粗暴的试错方法。

比较形象来说可以用走迷宫做例子,大多人类一般就是使用回溯法,当走到一条死路,就往回退到前一个岔路,尝试另外一条,直到走出。另一个经典的就是解答Sudoku Puzzle,也就是数独游戏。以经典的9*9数独游戏为例。通过计算机语言将数据从1到9的数字代入单元格种一次尝试,如若发现错误,就换一个数再试;若到不行,就回溯到上一个空白单元格重新尝试下一个可能数字。

作者:大肆叉
链接:https://www.zhihu.com/question/30940411/answer/98431907
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

这里其实不需要剪枝,不需要额外的判断,因为集合里面都是无序不重复的元素,加上遍历的游标(start)先把含有nums[0]的子集遍历玩,再去遍历不含nums[0]的子集即可。这样效率也是很高的。流程图如下:

效率:

猜你喜欢

转载自www.cnblogs.com/ekoeko/p/9689924.html