标签:example 著作权 amp www. href www integer inpu not
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]的子集即可。这样效率也是很高的。流程图如下:
效率:
标签:example 著作权 amp www. href www integer inpu not
原文地址:https://www.cnblogs.com/ekoeko/p/9689924.html