Leetcode - Combinations

Paste_Image.png

My code:

import java.util.ArrayList;
import java.util.List;

public class Solution {
    public List<List<Integer>> combine(int n, int k) {
        ArrayList<List<Integer>> result = new ArrayList<List<Integer>>();
        if (n <= 0 || k <= 0 || k > n)
            return result;
        ArrayList<Integer> sample = new ArrayList<Integer>();

        combine(1, n, k, sample, result);
        
        return result;
    }
    
    private void combine(int begin, int end, int k, ArrayList<Integer> sample, ArrayList<List<Integer>> result) {
        if (k <= 0)
            result.add(new ArrayList<Integer>(sample));
        else {
            for (int i = begin; i <= end; i++) {
                sample.add(i);
                combine(i + 1, end, k - 1, sample, result);
                sample.remove(sample.size() - 1);
            }
            
            
        }   
    }
    
    public static void main(String[] args) {
        Solution test = new Solution();
        System.out.println(test.combine(5,3));
        
        
    }
}

My test result:

Paste_Image.png

好久沒有做題了被环。。详幽。十天筛欢。等等說。

這道題目著實不錯啊。思路到現(xiàn)在也是精神上理解了下悴能。
其實就是揣钦。比如 5, 3

那么一開始,
1漠酿, 2冯凹, 3 進袋。
然后 有個刪除成員的細節(jié)操作炒嘲,所以又變?yōu)椋?br> 1, 2 繼續(xù)for 循環(huán)
然后 i = 4. 于是宇姚。
1, 2, 4 進袋。
1, 2, 5. 進袋夫凸。
然后for循環(huán)結束浑劳。整個函數(shù)結束,跳轉到上一個遞歸處夭拌。即魔熏。
1, 然后插入2.
于是鸽扁,刪除2蒜绽,繼續(xù)for循環(huán)。
插入3桶现, 于是
1躲雅, 3, 繼續(xù)遞歸骡和。相赁。
以此類推。
我之前的確一直有這樣的迷惑慰于。
ArrayList, Queue, Stack 這些可以存儲數(shù)據(jù)的包類钮科,該如何在遞歸思想中保證其唯一性。
比如婆赠。
ArrayList a;
recursion(5, a);
...

當此處繼續(xù)對a進行操作時跺嗽,a的內(nèi)容已經(jīng)發(fā)生了變化∫吃澹可能多了一些元素桨嫁,也可能少了一些元素。因為他是和遞歸中的那些ArrayList 引用指向的同一個內(nèi)存塊份帐。所以是統(tǒng)一的璃吧。
所以這段代碼有個細節(jié)。

if (k <= 0)
            result.add(new ArrayList<Integer>(sample));

為什么要新new一個ArrayList對象呢废境?因為儲存在result這個范圍內(nèi)的仍然是指針畜挨,指向sample的那個內(nèi)存塊筒繁。如果不新new一個然后把原內(nèi)容拷貝進來,那么就是仍指向原內(nèi)存巴元。那么存儲的所有的指針都是指向同一個內(nèi)存塊sample毡咏,然后打印出來的內(nèi)容都是sample最后狀態(tài)的內(nèi)容。所以必須先new一個逮刨。

這個算法還是一如既往的細致呕缭,靈巧。贊修己!

好久沒刷題了恢总。一恍惚,十天過去了睬愤,本來這十天可以干很多事的片仿。算了,暑假在家沒有怎么休息過尤辱,之前的確過于認真了砂豌,就算放松這十天吧。
哎光督,馬上就要走了阳距,沒想到,在英國期盼的這些事可帽,
見到爸媽然后狂吃美食,畢業(yè)典禮和同學的狂歡窗怒,和丹妮碰面一起旅行映跟,和童年的小伙伴一起聚聚。扬虚。努隙。這些事,這些盼了半年的事辜昵,這些一想起來就激動不已的事荸镊,竟然就這么過去了。
其實很多都做得還不夠好堪置,玩的不夠盡興躬存。尤其是畢業(yè)典禮。剛回校三天舀锨,剛適應同學的體溫岭洲,學校就強制離校了。
和丹妮坎匿,時間實在是太短了盾剩,短的我想帶她去各處玩卻發(fā)現(xiàn)哪個地方時間都是那么的緊雷激。你至少給我十天啊,老天告私。??
這個世界上有條路屎暇,叫做, California State Route 1. I hope I can drive you through this long road, my girl, away from anything, everything, just you, and me.
爸媽的話驻粟,我內(nèi)心是無比愛他們的根悼,但是總覺得說出來肉麻,然后說不出來格嗅。有時候還故意氣氣他們番挺,但他們的確為了做了太多太多。
昨天老爸50歲生日屯掖,但是過得很簡單玄柏,就我和我媽陪著他,我們?nèi)齻€人贴铜。
他對我提出了他的要求粪摘,
第一,留學在外绍坝,人身安全第一位徘意,絕對要注意安全,維護身體健康轩褐。
第二椎咧,要做一個讓爸媽說起來覺得驕傲的兒子。
我會把介,努力去做到的勤讽,為了你們,也為了我拗踢。
今天去和表哥還有他女朋友吃了一頓飯脚牍,挺好的,我對她也挺滿意的巢墅。心里不知道為什么诸狭,挺高興的,好久沒這么高興了君纫。也許他是我內(nèi)心中驯遇,認為的,很重要很重要的人吧蓄髓。
但是表哥工作最近被辭了妹懒,然后還沒找到工作,這個事也一直瞞著那個姑娘双吆,畢竟表哥條件不是很好眨唬,人家姑娘已經(jīng)很好了会前,如果知道他現(xiàn)在沒了工作,對于匾竿,結婚瓦宜,還是會猶豫一些吧。所以瞞著她岭妖,打算先找到工作再說临庇。
從小到大,我總覺得昵慌,因為一些自己弱的原因而去隱瞞假夺,而去騙人,給自己所帶來的屈辱斋攀,遠比把這種弱的原因暴露出來更加讓人感到羞恥已卷。我一直記得小時候考得不好,別人問我成績淳蔼,我媽想撒撒謊侧蘸,要點面子,但我爸就堅決不同意鹉梨,就是得說真的讳癌。
我真覺得,這是一個好習慣存皂。
一個連自己弱點都無法正視的人晌坤,又談何奮發(fā)去改變這些弱點呢?
哎旦袋,想說的還有好多骤菠,我還是很懷念英國的日子,真的太美好了猜憎。
有機會娩怎,我一定要把那些寫成一篇文章搔课,發(fā)在這里胰柑。QQ空間實在是不太好意思發(fā)文章了,否則別人會覺得我又情緒泛濫了爬泥。
奈何柬讨,我就是個情緒泛濫的人。這算不算袍啡,不敢正視自己的弱點踩官。
哈哈,我覺得境输,根本不算蔗牡。
對了,給那個美國朋友寫去的郵件還沒回,不正常根蟹。估計是給我里面一段描寫我對資本主義理解的文章所激怒了吧姑裂。哈哈。希望不是黔攒。還想著感恩節(jié)去他家做客呢趁啸。
**
總結:遞歸,Array, 如何保證遞歸中ArrayList的統(tǒng)一性督惰。
**

Anyway, Good luck, Richardo!

My code:

public class Solution {
    public List<List<Integer>> combine(int n, int k) {
        ArrayList<List<Integer>> ret = new ArrayList<List<Integer>>();
        if (n <= 0 || k <= 0 || k > n) {
            return ret;
        }
        helper(1, k, n, ret, new ArrayList<Integer>());
        return ret;
    }
    
    private void helper(int begin, int k, int n, List<List<Integer>> ret, List<Integer> group) {
        if (group.size() > k) {
            return;
        }
        else if (group.size() == k) {
            ret.add(new ArrayList<Integer>(group));
            return;
        }
        else {
            if (begin > n) {
                return;
            }
            else {
                for (int i = begin; i <= n; i++) {
                    group.add(i);
                    helper(i + 1, k, n, ret, group);
                    group.remove(group.size() - 1);
                }
            }
        }
    }
}

差不多的做法不傅。

Combination 還有一種更高效的解法:

public class Solution {
    public List<List<Integer>> combine(int n, int k) {
        List<List<Integer>> ret = new ArrayList<List<Integer>>();
        if (k < 0 || k > n) {
            return ret;
        }
        else if (k == 0) {
            ret.add(new ArrayList<Integer>());
            return ret;
        }
        else {
            ret = combine(n - 1, k - 1);
            for (List<Integer> list : ret) {
                list.add(n);
            }
            
            ret.addAll(combine(n - 1, k));
            return ret;
        }
     }
}

復雜度應該都在 O(n!) 左右。
這個做法的思想就是赏胚。
對于一個數(shù)访娶,他只有兩種情況:
要么在 combination 中,
要么不在栅哀。

combine(n - 1, k - 1) 算出在的情況震肮,然后統(tǒng)一加入 n
combine(n - 1, k) 算出不在的情況,直接插入ret

Anyway, Good luck, Richardo! -- 08/06/2016

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末留拾,一起剝皮案震驚了整個濱河市戳晌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌痴柔,老刑警劉巖沦偎,帶你破解...
    沈念sama閱讀 211,496評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異咳蔚,居然都是意外死亡豪嚎,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,187評論 3 385
  • 文/潘曉璐 我一進店門谈火,熙熙樓的掌柜王于貴愁眉苦臉地迎上來侈询,“玉大人,你說我怎么就攤上這事糯耍∪幼郑” “怎么了?”我有些...
    開封第一講書人閱讀 157,091評論 0 348
  • 文/不壞的土叔 我叫張陵温技,是天一觀的道長革为。 經(jīng)常有香客問我,道長舵鳞,這世上最難降的妖魔是什么震檩? 我笑而不...
    開封第一講書人閱讀 56,458評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮蜓堕,結果婚禮上抛虏,老公的妹妹穿的比我還像新娘博其。我一直安慰自己,他們只是感情好迂猴,可當我...
    茶點故事閱讀 65,542評論 6 385
  • 文/花漫 我一把揭開白布贺奠。 她就那樣靜靜地躺著,像睡著了一般错忱。 火紅的嫁衣襯著肌膚如雪儡率。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,802評論 1 290
  • 那天以清,我揣著相機與錄音儿普,去河邊找鬼。 笑死掷倔,一個胖子當著我的面吹牛眉孩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播勒葱,決...
    沈念sama閱讀 38,945評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼浪汪,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了凛虽?” 一聲冷哼從身側響起死遭,我...
    開封第一講書人閱讀 37,709評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎凯旋,沒想到半個月后呀潭,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,158評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡至非,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,502評論 2 327
  • 正文 我和宋清朗相戀三年钠署,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片荒椭。...
    茶點故事閱讀 38,637評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡谐鼎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出趣惠,到底是詐尸還是另有隱情狸棍,我是刑警寧澤,帶...
    沈念sama閱讀 34,300評論 4 329
  • 正文 年R本政府宣布信卡,位于F島的核電站隔缀,受9級特大地震影響题造,放射性物質(zhì)發(fā)生泄漏傍菇。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,911評論 3 313
  • 文/蒙蒙 一界赔、第九天 我趴在偏房一處隱蔽的房頂上張望丢习。 院中可真熱鬧牵触,春花似錦、人聲如沸咐低。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,744評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽见擦。三九已至钉汗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鲤屡,已是汗流浹背损痰。 一陣腳步聲響...
    開封第一講書人閱讀 31,982評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留酒来,地道東北人卢未。 一個月前我還...
    沈念sama閱讀 46,344評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像堰汉,于是被迫代替她去往敵國和親辽社。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,500評論 2 348

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

  • 先附上原題: 給定兩個數(shù)n和k翘鸭,寫出所有k個數(shù)字的組合滴铅,數(shù)值范圍從1~n,并且每一個組合中的數(shù)字不得重復就乓。這道題目...
    書呆子的復仇閱讀 1,565評論 0 0
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,768評論 25 707
  • 背景 一年多以前我在知乎上答了有關LeetCode的問題, 分享了一些自己做題目的經(jīng)驗失息。 張土汪:刷leetcod...
    土汪閱讀 12,738評論 0 33
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn)档址,斷路器盹兢,智...
    卡卡羅2017閱讀 134,632評論 18 139
  • 薄荷小姐爬上床,膝蓋壓在床單上守伸,平整的床單深深陷下去一個大窩绎秒,薄荷小姐有點心疼,早上拍拍撫撫多少次才把它弄得那么...
    愛幻想的薄荷糖閱讀 265評論 0 0