1. 程式人生 > >[leetcode][78] Subsets

[leetcode][78] Subsets

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