求子集

http://www.cnblogs.com/grandyang/p/4309345.html

Given a set of distinct integers,S, return all possible subsets.

Note:

Elements in a subset must be in non-descending order.

The solution set must not contain duplicate subsets.


For example,

IfS=[1,2,3], a solution is:

[

? [3],

? [1],

? [2],

? [1,2,3],

? [1,3],

? [2,3],

? [1,2],

? []

]


這道求子集合的問(wèn)題,由于其要列出所有結(jié)果吓笙,按照以往的經(jīng)驗(yàn)只冻,肯定要是要用遞歸來(lái)做萧落。這道題其實(shí)它的非遞歸解法相對(duì)來(lái)說(shuō)更簡(jiǎn)單一點(diǎn)坏匪,下面我們先來(lái)看非遞歸的解法,由于題目要求子集合中數(shù)字的順序是非降序排列的讥耗,所有我們需要預(yù)處理打厘,先給輸入數(shù)組排序,然后再進(jìn)一步處理秫逝,最開始我在想的時(shí)候恕出,是想按照子集的長(zhǎng)度由少到多全部寫出來(lái),比如子集長(zhǎng)度為0的就是空集违帆,空集是任何集合的子集浙巫,滿足條件,直接加入刷后。下面長(zhǎng)度為1的子集的畴,直接一個(gè)循環(huán)加入所有數(shù)字,子集長(zhǎng)度為2的話可以用兩個(gè)循環(huán)尝胆,但是這種想法到后面就行不通了丧裁,因?yàn)檠h(huán)的個(gè)數(shù)不能無(wú)限的增長(zhǎng),所以我們必須換一種思路含衔。我們可以一位一位的網(wǎng)上疊加煎娇,比如對(duì)于題目中給的例子[1,2,3]來(lái)說(shuō),最開始是空集抱慌,那么我們現(xiàn)在要處理1逊桦,就在空集上加1,為[1]抑进,現(xiàn)在我們有兩個(gè)自己[]和[1]强经,下面我們來(lái)處理2,我們?cè)谥暗淖蛹A(chǔ)上寺渗,每個(gè)都加個(gè)2匿情,可以分別得到[2]兰迫,[1, 2],那么現(xiàn)在所有的子集合為[], [1], [2], [1, 2]炬称,同理處理3的情況可得[3], [1, 3], [2, 3], [1, 2, 3], 再加上之前的子集就是所有的子集合了汁果,代碼如下:


解法一:

// Non-recursionclass Solution {public:

? ? vector > subsets(vector &S) {

? ? ? ? vector > res(1);

? ? ? ? sort(S.begin(), S.end());

? ? ? ? for(inti =0; i < S.size(); ++i) {

? ? ? ? ? ? intsize = res.size();

? ? ? ? ? ? for(intj =0; j < size; ++j) {

? ? ? ? ? ? ? ? res.push_back(res[j]);

? ? ? ? ? ? ? ? res.back().push_back(S[i]);

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? return res;

? ? }

};


整個(gè)添加的順序?yàn)椋?/p>

[]

[1]

[2]

[1 2]

[3]

[1 3]

[2 3]

[1 2 3]


下面來(lái)看遞歸的解法,相當(dāng)于一種深度優(yōu)先搜索玲躯,參見網(wǎng)友JustDoIt的博客据德,由于原集合每一個(gè)數(shù)字只有兩種狀態(tài),要么存在跷车,要么不存在棘利,那么在構(gòu)造子集時(shí)就有選擇和不選擇兩種情況,所以可以構(gòu)造一棵二叉樹朽缴,左子樹表示選擇該層處理的節(jié)點(diǎn)善玫,右子樹表示不選擇,最終的葉節(jié)點(diǎn)就是所有子集合密强,樹的結(jié)構(gòu)如下:


? ? ? ? ? ? ? ? ? ? ? ? []? ? ? ?

? ? ? ? ? ? ? ? ? /? ? ? ? ? \? ? ? ?

? ? ? ? ? ? ? ? ? /? ? ? ? ? ? \? ?

? ? ? ? ? ? ? ? /? ? ? ? ? ? ? \

? ? ? ? ? ? ? [1]? ? ? ? ? ? ? ? []

? ? ? ? ? /? ? ? \? ? ? ? ? /? ? \

? ? ? ? ? /? ? ? ? \? ? ? ? /? ? ? \? ? ? ?

? ? ? [12]? ? ? [1]? ? ? [2]? ? []

? ? ? /? ? \? ? /? \? ? /? \? ? / \

? [123] [12] [13] [1] [23] [2] [3] []


解法二:

// Recursionclass Solution {public:

? ? vector > subsets(vector &S) {

? ? ? ? vector > res;

? ? ? ? vectorout;

? ? ? ? sort(S.begin(), S.end());

? ? ? ? getSubsets(S, 0,out, res);

? ? ? ? return res;

? ? }

? ? voidgetSubsets(vector &S,intpos, vector &out, vector > &res) {

? ? ? ? res.push_back(out);

? ? ? ? for(inti = pos; i < S.size(); ++i) {

? ? ? ? ? ? out.push_back(S[i]);

? ? ? ? ? ? getSubsets(S, i +1,out, res);

? ? ? ? ? ? out.pop_back();

? ? ? ? }

? ? }

};


整個(gè)添加的順序?yàn)椋?/p>

[]

[1]

[1 2]

[1 2 3]

[1 3]

[2]

[2 3]

[3]


最后我們?cè)賮?lái)看一種解法茅郎,這種解法是CareerCup書上給的一種解法,想法也比較巧妙或渤,把數(shù)組中所有的數(shù)分配一個(gè)狀態(tài)系冗,true表示這個(gè)數(shù)在子集中出現(xiàn),false表示在子集中不出現(xiàn)薪鹦,那么對(duì)于一個(gè)長(zhǎng)度為n的數(shù)組毕谴,每個(gè)數(shù)字都有出現(xiàn)與不出現(xiàn)兩種情況,所以共有2n中情況距芬,那么我們把每種情況都轉(zhuǎn)換出來(lái)就是子集了,我們還是用題目中的例子, [1 2 3]這個(gè)數(shù)組共有8個(gè)子集循帐,每個(gè)子集的序號(hào)的二進(jìn)制表示框仔,把是1的位對(duì)應(yīng)原數(shù)組中的數(shù)字取出來(lái)就是一個(gè)子集,八種情況都取出來(lái)就是所有的子集了拄养,參見代碼如下:

?123Subset

0FFF[]

1FFT3

2FTF2

3FTT23

4TFF1

5TFT13

6TTF12

7TTT123


解法三:

class Solution {public:

? ? vector > subsets(vector &S) {

? ? ? ? vector > res;

? ? ? ? sort(S.begin(), S.end());

? ? ? ? intmax =1<< S.size();

? ? ? ? for(intk =0; k < max; ++k) {

? ? ? ? ? ? vectorout= convertIntToSet(S, k);

? ? ? ? ? ? res.push_back(out);

? ? ? ? }

? ? ? ? return res;

? ? }

? ? vector convertIntToSet(vector &S,int k) {

? ? ? ? vector sub;

? ? ? ? intidx =0;

? ? ? ? for(inti = k; i >0; i >>=1) {

? ? ? ? ? ? if((i &1) ==1) {

? ? ? ? ? ? ? ? sub.push_back(S[idx]);

? ? ? ? ? ? }

? ? ? ? ? ? ++idx;

? ? ? ? }

? ? ? ? return sub;

? ? }

};

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末离斩,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子瘪匿,更是在濱河造成了極大的恐慌跛梗,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件棋弥,死亡現(xiàn)場(chǎng)離奇詭異核偿,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)顽染,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門漾岳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)轰绵,“玉大人,你說(shuō)我怎么就攤上這事尼荆∽笄唬” “怎么了?”我有些...
    開封第一講書人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵捅儒,是天一觀的道長(zhǎng)液样。 經(jīng)常有香客問(wèn)我,道長(zhǎng)巧还,這世上最難降的妖魔是什么鞭莽? 我笑而不...
    開封第一講書人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮狞悲,結(jié)果婚禮上撮抓,老公的妹妹穿的比我還像新娘。我一直安慰自己摇锋,他們只是感情好丹拯,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著荸恕,像睡著了一般乖酬。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上融求,一...
    開封第一講書人閱讀 51,155評(píng)論 1 299
  • 那天咬像,我揣著相機(jī)與錄音,去河邊找鬼生宛。 笑死县昂,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的陷舅。 我是一名探鬼主播倒彰,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼莱睁!你這毒婦竟也來(lái)了待讳?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤仰剿,失蹤者是張志新(化名)和其女友劉穎创淡,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體南吮,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡琳彩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片汁针。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡术辐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出施无,到底是詐尸還是另有隱情辉词,我是刑警寧澤,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布猾骡,位于F島的核電站瑞躺,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏兴想。R本人自食惡果不足惜幢哨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望嫂便。 院中可真熱鬧捞镰,春花似錦、人聲如沸毙替。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)厂画。三九已至凸丸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間袱院,已是汗流浹背屎慢。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留忽洛,地道東北人腻惠。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像欲虚,于是被迫代替她去往敵國(guó)和親妖枚。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353

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

  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi閱讀 7,322評(píng)論 0 10
  • 獨(dú)木舟說(shuō)苍在,不管以后我會(huì)遇到誰(shuí),會(huì)經(jīng)歷什么荠商,我都不相信愛情了寂恬。 張嘉佳說(shuō),不管我曾經(jīng)經(jīng)歷了什么莱没,我依然相信愛情初肉。 我...
    羥羊閱讀 402評(píng)論 0 2
  • 現(xiàn)在進(jìn)入冥想非常的快,感覺把意識(shí)集中在眉心時(shí)饰躲,整個(gè)人就寧?kù)o下來(lái)牙咏,隨著身體的每一個(gè)部分的放松臼隔,頭腦的疲倦和壓力都慢慢...
    趙小花_喜悅閱讀 785評(píng)論 0 0
  • 我想你一定還記得小明同學(xué)。 見到李曉明是在酒店門口妄壶,他坐在車?yán)锏戎覀儭? 李曉明是我的小學(xué)同學(xué)摔握,...
    安寧笑看人生閱讀 444評(píng)論 0 0
  • 雖然小朋友大部分時(shí)間都是軟糯甜萌,但也有非常annoying的時(shí)候丁寄。 最近感覺她已經(jīng)提前進(jìn)入terrible 2了...
    有魚閱讀 323評(píng)論 0 1