[leetcode][78] Subsets
阿新 • • 發佈:2018-09-22
clas pre 就是 ack not ica 商業 con 迷宮
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]的子集即可。這樣效率也是很高的。流程圖如下:
效率:
[leetcode][78] Subsets