算法題中的子集临燃,排列,組合

子集

例:[1,2,3] 的所有子集
結(jié)果 []烙心,[1]膜廊,[1,2],[1,2,3]淫茵,[1,3]爪瓜,[2],[2,3]匙瘪,[3]

算法原理描述

條件:集合中的元素不可重復(fù)铆铆,可按任意順序排列
算法過(guò)程:在第一個(gè)位置枚舉集合中的所有元素,在每個(gè)元素的下一位置枚舉所有在它之后的元素丹喻,之后表示在集合中的順序薄货。在每加入一個(gè)新元素時(shí),形成一個(gè)結(jié)果碍论。在當(dāng)前位置枚舉完所有可以枚舉的元素后谅猾,返回上一層。
算法過(guò)程舉例:
[]????????????空集也算一個(gè)子集
[1],?????????在第一個(gè)位置枚舉集合中的所有元素,即1税娜,2先煎,3,第一次是 1
[1,2],??????在第二個(gè)位置枚舉集合中 1 之后的元素巧涧,即是 2 和 3薯蝎,第一次是 2
[1,2,3],???在第三個(gè)位置枚舉集合中 2 之后的元素,只有 3 谤绳,枚舉完就返回第二個(gè)位置
[1,3],??????在第二個(gè)位置枚舉集合中 1 之后的元素占锯,第二次是 3,枚舉完返回第一個(gè)位置
[2],?????????在第一個(gè)位置枚舉集合中的所有元素缩筛,第二次是 2
[2,3],??????在第二個(gè)位置枚舉集合中 2 之后的元素消略,只有 3,枚舉完返回第一個(gè)位置
[3]??????????在第一個(gè)位置枚舉集合中的所有元素瞎抛,第三次是 3艺演,枚舉完,結(jié)束

算法的動(dòng)態(tài)圖演示

算法代碼

List<List<Integer>> subsets(int[] nums) {
        List<List<Integer>> list = new ArrayList<>();
        backtrack(list, new ArrayList<>(), nums, 0);
        return list;
}

void backtrack(List<List<Integer>> list , List<Integer> tempList, int [] nums, int start){
        list.add(new ArrayList<>(tempList));
        for(int i = start; i < nums.length; i++){
            tempList.add(nums[i]);
            backtrack(list, tempList, nums, i + 1);
            tempList.remove(tempList.size() - 1);
        }
}

看明白第一個(gè)桐臊,下面兩個(gè)就容易理解了

?

排列

例:[1,2,3] 的所有排列情況
結(jié)果:[1,2,3]胎撤,[1,3,2],[2,1,3]断凶,[2,3,1]伤提,[3,1,2],[3,2,1]

算法原理描述

條件:集合中的元素不可重復(fù)认烁,可按任意順序排列
算法過(guò)程:在第一個(gè)位置枚舉集合中的所有元素肿男,在每個(gè)元素的下一位置枚舉所有集合中且在前面的位置沒(méi)有出現(xiàn)過(guò)的元素。在元素?cái)?shù)量給出集合的元素?cái)?shù)量相等時(shí)却嗡,形成一個(gè)結(jié)果舶沛。在當(dāng)前位置枚舉完所有可以枚舉的元素后,返回上一層窗价。

算法代碼

List<List<Integer>> permute(int[] nums) {
        List<List<Integer>> list = new ArrayList<>();
        backtrack(list, new ArrayList<>(), nums);
        return list;
}

void backtrack(List<List<Integer>> list, List<Integer> tempList, int [] nums){
        if(tempList.size() == nums.length){
            list.add(new ArrayList<>(tempList));
        } else {
            for(int i = 0; i < nums.length; i++) {
                if(tempList.contains(nums[i])) continue;
                tempList.add(nums[i]);
                backtrack(list, tempList, nums);
                tempList.remove(tempList.size() - 1);
            }
        }
}

?

組合

例:在 [2,3,5] 中選任意元素 (可以重復(fù)選擇同一個(gè)) 如庭,之和為 8
結(jié)果:[2,2,2,2],[2,3,3]舌镶,[3,5]

算法原理描述

條件:集合中的元素不可重復(fù)柱彻,按數(shù)字順序從小到大排列
算法過(guò)程:在第一個(gè)位置枚舉集合中的所有元素,在每個(gè)元素的下一位置枚舉所有在它之后的元素 (包括它)餐胀,之后表示在集合中的順序哟楷。在所有元素的和等于 8 時(shí),形成一個(gè)結(jié)果否灾。在所有元素的和大于 8 時(shí)卖擅,返回上一層。

算法代碼

List<List<Integer>> combinationSum(int[] nums, int target) {
        List<List<Integer>> list = new ArrayList<>();
        Arrays.sort(nums);
        backtrack(list, new ArrayList<>(), nums, target, 0);
        return list;
}

void backtrack(List<List<Integer>> list, List<Integer> tempList, int [] nums, int remain, int start){
        if(remain < 0) return;
        else if(remain == 0) list.add(new ArrayList<>(tempList));
        else{ 
            for(int i = start; i < nums.length; i++){
                tempList.add(nums[i]);
                backtrack(list, tempList, nums, remain - nums[i], i); 
                tempList.remove(tempList.size() - 1);
            }
        }
}

代碼引用自https://leetcode.com/problems/subsets/discuss/27281/A-general-approach-to-backtracking-questions-in-Java-(Subsets-Permutations-Combination-Sum-Palindrome-Partitioning)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市惩阶,隨后出現(xiàn)的幾起案子挎狸,更是在濱河造成了極大的恐慌,老刑警劉巖断楷,帶你破解...
    沈念sama閱讀 222,681評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锨匆,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡冬筒,警方通過(guò)查閱死者的電腦和手機(jī)恐锣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)舞痰,“玉大人土榴,你說(shuō)我怎么就攤上這事∠炫#” “怎么了玷禽?”我有些...
    開封第一講書人閱讀 169,421評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)呀打。 經(jīng)常有香客問(wèn)我矢赁,道長(zhǎng),這世上最難降的妖魔是什么聚磺? 我笑而不...
    開封第一講書人閱讀 60,114評(píng)論 1 300
  • 正文 為了忘掉前任坯台,我火速辦了婚禮炬丸,結(jié)果婚禮上瘫寝,老公的妹妹穿的比我還像新娘。我一直安慰自己稠炬,他們只是感情好焕阿,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,116評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著首启,像睡著了一般暮屡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上毅桃,一...
    開封第一講書人閱讀 52,713評(píng)論 1 312
  • 那天褒纲,我揣著相機(jī)與錄音,去河邊找鬼钥飞。 笑死莺掠,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的读宙。 我是一名探鬼主播彻秆,決...
    沈念sama閱讀 41,170評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了唇兑?” 一聲冷哼從身側(cè)響起酒朵,我...
    開封第一講書人閱讀 40,116評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎扎附,沒(méi)想到半個(gè)月后蔫耽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,651評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡留夜,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,714評(píng)論 3 342
  • 正文 我和宋清朗相戀三年针肥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片香伴。...
    茶點(diǎn)故事閱讀 40,865評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡慰枕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出即纲,到底是詐尸還是另有隱情具帮,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布低斋,位于F島的核電站蜂厅,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏膊畴。R本人自食惡果不足惜掘猿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,211評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望唇跨。 院中可真熱鬧稠通,春花似錦、人聲如沸买猖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)玉控。三九已至飞主,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間高诺,已是汗流浹背碌识。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留虱而,地道東北人筏餐。 一個(gè)月前我還...
    沈念sama閱讀 49,299評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像薛窥,于是被迫代替她去往敵國(guó)和親胖烛。 傳聞我的和親對(duì)象是個(gè)殘疾皇子眼姐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,870評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • Java集合類可用于存儲(chǔ)數(shù)量不等的對(duì)象,并可以實(shí)現(xiàn)常用的數(shù)據(jù)結(jié)構(gòu)如棧,隊(duì)列等,Java集合還可以用于保存具有映射關(guān)...
    小徐andorid閱讀 1,946評(píng)論 0 13
  • 原文地址:http://theory.stanford.edu/~amitp/GameProgramming/ 1...
    達(dá)微閱讀 19,485評(píng)論 0 28
  • 我將無(wú)法終止我陳舊之理想, 如斷流遠(yuǎn)去赴死向來(lái)不知疲倦 如盛夏將誕生雨后黃昏一場(chǎng) 懸崖上暮色花草陣陣蒼茫 而我最終...
    王謫閱讀 723評(píng)論 9 11
  • Shell俗稱殼,用來(lái)區(qū)別于Kernel(核)趟畏,是指“提供使用者使用界面”的軟件(命令解析器)贡歧。它類似于DOS下c...
    daisx閱讀 248評(píng)論 0 0
  • 獨(dú)坐窗前,聆聽細(xì)雨赋秀, 清新的空氣利朵,絲絲涼意, 悠揚(yáng)的歌聲猎莲,纏綿悱惻绍弟, 淡淡的書香,留戀不舍著洼, 醇厚的濃茶樟遣,腸氣回蕩...
    唐心可人兒閱讀 204評(píng)論 0 1