1. 程式人生 > >leetcode 78. Subsets-陣列子集|回溯演算法

leetcode 78. Subsets-陣列子集|回溯演算法

【思路1-Java】回溯演算法|遞迴實現

本解法採用回溯演算法實現,回溯演算法的基本形式是“遞迴+迴圈”,正因為迴圈中巢狀著遞迴,遞迴中包含迴圈,這才使得回溯比一般的遞迴和單純的迴圈更難理解,其實我們熟悉了它的基本形式,就會覺得這樣的演算法難度也不是很大。原陣列中的每個元素有兩種狀態:存在和不存在。

① 外層迴圈逐一往中間集合 temp 中加入元素 nums[i],使這個元素處於存在狀態

② 開始遞迴,遞迴中攜帶加入新元素的 temp,並且下一次迴圈的起始是 i 元素的下一個,因而遞迴中更新 i 值為 i + 1

③ 將這個從中間集合 temp 中移除,使該元素處於不存在狀態

public class Solution {
    public List<List<Integer>> subsets(int[] nums) {
        List<List<Integer>> res = new ArrayList<List<Integer>>();
        List<Integer> temp = new ArrayList<Integer>();
        dfs(res, temp, nums, 0);
        return res;
    }
    private void dfs(List<List<Integer>> res, List<Integer> temp, int[] nums, int j) {
        res.add(new ArrayList<Integer>(temp));
        for(int i = j; i < nums.length; i++) {
            temp.add(nums[i]);  //① 加入 nums[i]
            dfs(res, temp, nums, i + 1);  //② 遞迴
            temp.remove(temp.size() - 1);  //③ 移除 nums[i]
        }
    }
}
10 / 10 test cases passed. Runtime: 2 ms  Your runtime beats 61.73% of javasubmissions.

【思路2-Java、Python】組合|非遞迴實現

這種方法是一種組合的方式

① 最外層迴圈逐一從 nums 陣列中取出每個元素 num

② 內層迴圈從原來的結果集中取出每個中間結果集,並向每個中間結果集中新增該 num 元素

③往每個中間結果集中加入 num

④將新的中間結果集加入結果集中

public class Solution {
    public List<List<Integer>> subsets(int[] nums) {
        List<List<Integer>> res = new ArrayList<List<Integer>>();
        res.add(new ArrayList<Integer>());
        for (int num : nums) {  // ①從陣列中取出每個元素
            int size = res.size();
            for (int i = 0; i < size; i++) {
                List<Integer> temp = new ArrayList<>(res.get(i));  // ②逐一取出中間結果集
                temp.add(num);  // ③將 num 放入中間結果集
                res.add(temp);  // ④加入到結果集中
            }
        }
        return res;
    }
}
10 / 10 test cases passed. Runtime: 2 ms  Your runtime beats 61.73% of javasubmissions.

class Solution(object):
    def subsets(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        res = [[]]
        for num in nums :
            for temp in res[:] :
                x = temp[:]
                x.append(num)
                res.append(x)
        return res
10 / 10 test cases passed. Runtime: 52 ms  Your runtime beats 98.24% of pythonsubmissions.

相關推薦

leetcode 78. Subsets-陣列子集|回溯演算法

【思路1-Java】回溯演算法|遞迴實現 本解法採用回溯演算法實現,回溯演算法的基本形式是“遞迴+迴圈”,正因為迴圈中巢狀著遞迴,遞迴中包含迴圈,這才使得回溯比一般的遞迴和單純的迴圈更難理解,其實我們熟悉了它的基本形式,就會覺得這樣的演算法難度也不是很大。原陣列中的每個元

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 su

遞迴-陣列子集leetcode 78 Subsets

    public List<List<Integer>> subsets(int[] nums) {         List<List<Integer>> result = new ArrayList<List<Integer>>(

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 subs

Leetcode 78. Subsets 子集 解題報告

1 解題思想 這道題需要求給定陣列的子集,特別要求有: 1、必須是升序 2、不能出現重複的 所以做法其實也就是,首先排序,然後回溯。。和昨天那題一樣,可以回去看一下。記得選擇下一個的時候,別和當前的值重複就可以了。 2 原題 Given a set

LeetCode 78. Subsets 20170606

range 遞歸 思路 length .com 相等 png leetcode pen Given a set of distinct integers, nums, return all possible subsets. Note: The solution set m

LeetCode 78: Subsets

nbsp rec rem clas col stream arr ger pri class Solution { public List<List<Integer>> subsets(int[] nums) { List&

[LeetCode] 78. Subsets 子集合

tinc ++i integer += pre distinct size_t sort contain Given a set of distinct integers, nums, return all possible subsets (the power set).

Leetcode 78. Subsets (backtracking) 90 subset

check emp rev ++ remove tin turn ins tracking using prev class Solution { List<List<Integer>> res = new ArrayList<Lis

[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:

leetcode 78 Subsets

Given a set of distinct integers, nums, return all possible subsets (the power set). Note: The solution set must not contain dup

LeetCode--78. Subsets

題目連結:https://leetcode.com/problems/subsets/ 求集合的所有子集,數學上大小為n的集合有2^n個子集。用回溯法就能輕鬆解決!一如既往地模板套路:用一個全域性變數ret儲存所有子集合,用visited表示取或者不取某個陣列位置上的數,遞迴引數是當前待確定取還

Leetcode 78. Subsets

clas void ets medium 指數 com subset math [] 題目 鏈接:https://leetcode.com/problems/subsets/ Level: Medium Discription: Given a set of distin

leetcode 78 Subsets

78. Subsets 題目描述: Given a set of distinct integers, nums, return all possible subsets. Note: The solution set must not contain duplicate

leetcode 90 subsets-ii 子集II

class Solution { public: vector<vector<int>> subsetsWithDup(vector<int>& nu

19.2.15 [LeetCode 78] Subsets

pos cli must integer clas ssi out code b- Given a set of distinct integers, nums, return all possible subsets (the power set). Note: The

Leetcode78. Subsets(求集合的子集問題)

構造 alt soft vat 題目 www. ack tco sub 78. Subsets(求集合的子集問題) 【分析】:求集合的所有子集問題。題目要求子集中元素非遞減序排列,因此我們先要對原來的集合進行排序。原集合中每一個元素在子集中有兩種狀態:要麽存在、要麽不存在

LeetCode 78 90 子集 子集II (回溯,遞迴)

1.子集 難度:中等 給定一組不含重複元素的整數陣列 nums,返回該陣列所有可能的子集(冪集)。 說明:解集不能包含重複的子集。 示例: 輸入: nums = [1,2,3] 輸出: [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], []

leetcode 遞歸回溯-78 Subsets(java) ;80 Subsets II

一、 題目分析: 這個和我之前跟著左程雲老師的牛客網初級班的最後一課,動態規劃那一課看到過差不多的題 那個是動態規劃之前的一個遞迴的使用,讓列印一個字串的全排列 跟這個題是一模一樣的,不一樣的是字串可以直接char[]chr=str.toCharArray() 和str=S

LeetCode78. Subsets(找出一個數組中所有的子集

Given a set of distinct integers, nums, return all possible subsets (the power set). Note: The solution set must not contain dup