LeetCode-090-子集II

給定一個(gè)可能包含重復(fù)元素的整數(shù)數(shù)組 nums,返回該數(shù)組所有可能的子集(冪集)。

說(shuō)明:解集不能包含重復(fù)的子集。

示例:

輸入: [1,2,2]
輸出:
[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
[]
]

來(lái)源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/subsets-ii

解題思路

采用深度優(yōu)先搜索
dfs(int[] nums, int start, Deque<Integer> path, List<List<Integer>> result)
參數(shù)依次是數(shù)組,起始拼接位置,搜索過(guò)程中的路徑,結(jié)果集
因?yàn)椴荒艹霈F(xiàn)重復(fù)元素,比如[1, 2, 2]這個(gè)集合,會(huì)出現(xiàn)兩個(gè)[1, 2]
這時(shí)要考慮"剪枝",剪枝的前提是將數(shù)組排序
然后考慮剪枝的條件"同一層不能用相同數(shù)字"
比如[1, 2, 2]深度優(yōu)先遍歷時(shí)

image.png

在代碼中如何呈現(xiàn)?
在關(guān)鍵方法 dfs() 中,for 循環(huán)代表了同一層,而遞歸代表了不同層
所以在 for 循環(huán)中要判斷索引 i 是否為起始索引,不是起始索引且和前一個(gè)元素相同則剪枝

代碼

class Solution {
    public List<List<Integer>> subsetsWithDup(int[] nums) {
        List<List<Integer>> result = new LinkedList<>();
        if (nums == null || nums.length == 0) {
            return result;
        }
        result.add(new ArrayList<>()); // 空集
        Arrays.sort(nums);
        Deque<Integer> path = new LinkedList<>();
        dfs(nums, 0, path, result);
        return result;
    }

    private void dfs(int[] nums, int start, Deque<Integer> path, List<List<Integer>> result) {
        for (int i = start; i < nums.length; i++) {
            if (i == start || nums[i] != nums[i - 1]) {
                path.addLast(nums[i]);
                result.add(new ArrayList<>(path));
                dfs(nums, i + 1, path, result);
                path.removeLast();
            }
        }
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 題目:給定一個(gè)可能包含重復(fù)元素的整數(shù)數(shù)組 nums,返回該數(shù)組所有可能的子集(冪集)。 說(shuō)明:解集不能包含重復(fù)的子...
    minningl閱讀 125評(píng)論 0 0
  • 給定一組不含重復(fù)元素的整數(shù)數(shù)組 nums,返回該數(shù)組所有可能的子集(冪集)。 說(shuō)明:解集不能包含重復(fù)的子集。 示例...
    刻苦驢噥閱讀 204評(píng)論 0 0
  • 90 Subsets II 子集 II Description:Given a collection of int...
    air_melt閱讀 251評(píng)論 0 4
  • 在這里,我們?cè)購(gòu)?fù)習(xí)一下 LeetCode 第 77 題。剪枝主要的出發(fā)點(diǎn)就在于,我們可以提前做好判斷,減少不必要的...
    李威威閱讀 645評(píng)論 0 0
  • 推薦指數(shù): 6.0 書(shū)籍主旨關(guān)鍵詞:特權(quán)、焦點(diǎn)、注意力、語(yǔ)言聯(lián)想、情景聯(lián)想 觀點(diǎn): 1.統(tǒng)計(jì)學(xué)現(xiàn)在叫數(shù)據(jù)分析,社會(huì)...
    Jenaral閱讀 5,976評(píng)論 0 5

友情鏈接更多精彩內(nèi)容