18.帶重復(fù)元素的子集

描述

給定一個可能具有重復(fù)數(shù)字的列表,返回其所有可能的子集

注意事項

子集中的每個元素都是非降序的
兩個子集間的順序是無關(guān)緊要的
解集中不能包含重復(fù)子集

樣例

如果 S = [1,2,2],一個可能的答案為

[
  [2],
  [1],
  [1,2,2],
  [2,2],
  [1,2],
  []
]

挑戰(zhàn)

你可以同時用遞歸與非遞歸的方式解決么?

代碼

class Solution {
    /**
     * @param nums: A set of numbers.
     * @return: A list of lists. All valid subsets.
     */
    public ArrayList<ArrayList<Integer>> subsetsWithDup(int[] nums) {
        ArrayList<ArrayList<Integer>> results = new ArrayList<>();
        if (nums == null || nums.length == 0) {
            return results;
        }

        Arrays.sort(nums);

        ArrayList<Integer> subset = new ArrayList<Integer>();
        subsetWithDupHelper(nums, 0, subset, results);

        return results;
    }

    private void subsetWithDupHelper(int[] nums,
                                     int startIndex,
                                     ArrayList<Integer> subset,
                                     ArrayList<ArrayList<Integer>> results) {
        results.add(new ArrayList<Integer>(subset));

        for (int i = startIndex; i < nums.length; i++) {
            /* 本來初值是令i = startIndex,正常運行代碼不應(yīng)該出現(xiàn)取第二個不取
             * 第一個的情況,但此條if本身就是用于表示異常的,所以一切就變得
             * 可以理解了
             */

            if (i != 0 && nums[i] == nums[i - 1] && i > startIndex){
            /* i != 0是為了防止 i - 1越界,
             * nums[i] = nums[i - 1] 即當(dāng)前數(shù)等于前一個數(shù),
             * 從下面 subset 兩行代碼可以看出如果 nums[i - 1] 被加入 subset,
             * 那么下一個startIndex = i - 1 + 1 = i;
             * i > startIndex等價于i >= startIndex + 1,而上一個數(shù)是startIndex - 1;
             * 說明在startIndex - 1和startIndex + 1間存在一個數(shù),
             * 存在當(dāng)前值nums的前一個與它相等的值并沒有被添加到list里,這樣會重復(fù)
             */
                continue;
            }
            
            subset.add(nums[i]);
            subsetWithDupHelper(nums, i + 1, subset, results);
            subset.remove(subset.size() - 1);
        }
    }
}

本題和subset相比就多了一個去重的過程,去重的邏輯已經(jīng)在注釋里說清楚了,稍微補充點就是比如數(shù)組是[1,2,2],第一個2用A表示,第二個2用B表示,我們要的順序是[1,A],此時的要去的重就是[1,B]這種組合,比較容易混淆的是[1,A,B]這種情況A,B兩個2在同一個list里并不算重復(fù),去除的是兩個list之間的重復(fù)情況

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗。 張土汪:刷leetcod...
    土汪閱讀 12,929評論 0 33
  • http://python.jobbole.com/85231/ 關(guān)于專業(yè)技能寫完項目接著寫寫一名3年工作經(jīng)驗的J...
    燕京博士閱讀 7,827評論 1 118
  • 最近在寫個性化推薦的論文,經(jīng)常用到Python來處理數(shù)據(jù),被pandas和numpy中的數(shù)據(jù)選取和索引問題繞的比較...
    shuhanrainbow閱讀 4,708評論 6 19
  • 我那年16歲,打完暑假工拿到工資后,屁顛屁顛的去車站坐車回家,進(jìn)入車站后沒走幾步,就被一個陌生的中年男人擋住,我...
    竹月_閱讀 458評論 0 0
  • 白夜行 ? 當(dāng)囫圇吞棗的看完35萬字的《白夜行》時,對封面的一段話豁然開朗。 ? 白夜行:我的天空里沒...
    張半生閱讀 897評論 0 10

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