39&40&216&?337 Combination Sum

Combination Sum 1

Given a set of candidate numbers (C) and a target number (T), find all unique combinations in C where the candidate numbers sums to T.
The same repeated number may be chosen from C unlimited number of times.
Note:
All numbers (including target) will be positive integers.
The solution set must not contain duplicate combinations.

For example, given candidate set [2, 3, 6, 7] and target 7
A solution set is: [[7], [2, 2, 3]]

首先將數(shù)組排一下序,這樣如果找到當(dāng)前的值加起來(lái)已經(jīng)大于目標(biāo)了就不再找了
還是使用回溯算法讹俊,以上面的為例牵啦,我們的查找過(guò)程是這樣的:
2
22
222
2222

223
226

23
233

26

3
33
333

36

6
66

7

var combinationSum = function(candidates, target) {
    var result = [];
    var num = candidates.length;
    candidates.sort(function(a,b){
        return a-b;
    });
    var help = function (res,sum,start) {
        if (sum===target) {
            result.push(res.concat());
        } else if (sum<target) {
            for(var i = start; i < num; i++){
                res.push(candidates[i]);
                if ((sum+candidates[i])>target){
                    res.pop();
                    break;
                }
                help(res,sum+candidates[i],i);
                res.pop();
            }
        } 
    };
    help([],0,0);
    return result;
};

Combination Sum 2

Given a collection of candidate numbers (C) and a target number (T), find all unique combinations in C where the candidate numbers sums to T.
Each number in C may only be used once in the combination.
Note:
All numbers (including target) will be positive integers.
The solution set must not contain duplicate combinations.

For example, given candidate set [10, 1, 2, 7, 6, 1, 5] and target 8, A solution set is:
[ [1, 7], [1, 2, 5], [2, 6], [1, 1, 6]]
這個(gè)問(wèn)題和上面的區(qū)別是迫皱,給的元素有可能有重復(fù)茎活,但是結(jié)果是不能有重復(fù)的昙沦,且所有元素只能用一次
在同一層遞歸樹中,如果某元素已經(jīng)處理并進(jìn)入下一層遞歸载荔,那么與該元素相同的值就應(yīng)該跳過(guò)盾饮。否則將出現(xiàn)重復(fù)。
例如:1,1,2,3
如果第一個(gè)1已經(jīng)處理并進(jìn)入下一層遞歸1,2,3
那么第二個(gè)1就應(yīng)該跳過(guò)懒熙,因?yàn)楹罄m(xù)所有情況都已經(jīng)被覆蓋掉丘损。
而且所有相同元素中應(yīng)該是第一個(gè)進(jìn)入下一層遞歸,而不是任意一個(gè)
例如:1,1,2,3
如果第一個(gè)1已經(jīng)處理并進(jìn)入下一層遞歸1,2,3工扎,那么兩個(gè)1是可以同時(shí)出現(xiàn)在一個(gè)解中的
而如果選擇的是第二個(gè)1并進(jìn)入下一層遞歸2,3徘钥,那么不會(huì)出現(xiàn)兩個(gè)1的解了。

var combinationSum2 = function(candidates, target) {
    var result = [];
    var used = [];
    var num = candidates.length;
    candidates.sort(function(a,b){
        return a-b;
    });
    var help = function (res,sum,start) {
        if (sum===target) {
            //原來(lái)我打算在添加的時(shí)候遍歷整個(gè)result數(shù)組
            //看看有沒(méi)有一樣的
            // for (var i = result.length - 1;i>=0;i--) {
            //     if (result[i].length===res.length) {
            //         for (var j = res.length;j>=0;j--) {
            //             if (result[i][j]!==res[j])
            //                 break;
            //         }
            //         if (j<0)
            //             return;
            //     }
            // }
            result.push(res.concat());
        } else if (sum<target) {
            for(var i = start; i < num; i++){
                //這里將所有重復(fù)元素中的后幾個(gè)排除掉肢娘,不會(huì)進(jìn)入下一層
                if(i != start && candidates[i] == candidates[i-1]) 
                    continue; 
                res.push(candidates[i]);
                if ((sum+candidates[i])>target){
                    res.pop();
                    break;
                }
                //這里保證一個(gè)結(jié)果里不會(huì)重復(fù)用元素
                help(res,sum+candidates[i],i+1);
                res.pop();
            }
        } 
    };
    help([],0,0);
    return result;
};

Combination Sum 3

Find all possible combinations of k numbers that add up to a number n, given that only numbers from 1 to 9 can be used and each combination should be a unique set of numbers.
example:
Input: k = 3, n = 9
Output:
[[1,2,6], [1,3,5], [2,3,4]]
這個(gè)和上面的思想也是一樣的呈础,這里多了一個(gè)長(zhǎng)度和選用元素的限制

var combinationSum3 = function(k, n) {
    var result = [];
    var used = [];
    var candidates = [1,2,3,4,5,6,7,8,9];
    var num = candidates.length;
    var help = function (res,sum,start) {
        if (sum===n&&res.length===k) {
            result.push(res.concat());
        } else if (sum<n&&res.length<k) {
            for(var i = start; i < num; i++){
                res.push(candidates[i]);
                if ((sum+candidates[i])>n){
                    res.pop();
                    break;
                }
                //這里保證一個(gè)結(jié)果里不會(huì)重復(fù)用元素
                help(res,sum+candidates[i],i+1);
                res.pop();
            }
        } 
    };
    help([],0,0);
    return result;
};

Combination Sum 4

Given an integer array with all positive numbers and no duplicates, find the number of possible combinations that add up to a positive integer target.
Example:
nums = [1, 2, 3]
target = 4
The possible combination ways are:
(1, 1, 1, 1)
(1, 1, 2)
(1, 2, 1)
(1, 3)
(2, 1, 1)
(2, 2)
(3, 1)
Note that different sequences are counted as different combinations.
Therefore the output is 7.
Follow up:
What if negative numbers are allowed in the given array?
How does it change the problem?
What limitation we need to add to the question to allow negative numbers?
這里就算順序不一樣也要算上,只需要給出最后方法的數(shù)量橱健,估計(jì)之前的辦法不行了而钞。
試了一下,之前的辦法把所有特殊的優(yōu)化條件都去了拘荡,走完完全全的回溯算法臼节,果然超時(shí)了。
那也就是說(shuō)有動(dòng)態(tài)規(guī)劃的方法珊皿,可以利用之前的結(jié)果遞推官疲。
試想一下,如果現(xiàn)在我們只差一個(gè)數(shù)字就加到我們的target了亮隙,這個(gè)數(shù)字可能是數(shù)組中的任何一個(gè)數(shù)字途凫,對(duì)于每一個(gè)這樣的數(shù)字x,我們找到target-x這個(gè)數(shù)的組合的個(gè)數(shù)溢吻,于是:

comb[target] = sum(comb[target - nums[i]]), where 0 <= i < nums.length, and target >= nums[i].

這之中nums[i]就是x
所以:

var combinationSum4 = function(nums, target) {
    if (nums.length===0)
        return 0;
    var dp = [];
    dp[0] = 1;
    for (var i = 1; i <= target; ++i) {
        if (!dp[i])
            dp[i] = 0;
        for (var j = 0;j <nums.length;j++) {
            if (i >= nums[j]) {
                dp[i] += dp[i - nums[j]];
            }
        }
    }
    return dp[target] ? dp[target] : 0;
};

這樣每個(gè)target都找遍所有元素有點(diǎn)浪費(fèi)维费,先排個(gè)序,然后找到比target大的就不找了促王,這樣比較快犀盟。

var combinationSum4 = function(nums, target) {
    if (nums.length===0)
        return 0;
    nums.sort(function(a,b){
        return a-b;
    });
    var dp = [];
    dp[0] = 1;
    for (var i = 1; i <= target; ++i) {
        if (!dp[i])
            dp[i] = 0;
        for (var j = 0;j <nums.length;j++) {
            if (i >= nums[j]) {
                dp[i] += dp[i - nums[j]];
            } else
                break;
        }
    }
    return dp[target] ? dp[target] : 0;
};
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蝇狼,隨后出現(xiàn)的幾起案子阅畴,更是在濱河造成了極大的恐慌,老刑警劉巖迅耘,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贱枣,死亡現(xiàn)場(chǎng)離奇詭異监署,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)纽哥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門钠乏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人春塌,你說(shuō)我怎么就攤上這事晓避。” “怎么了只壳?”我有些...
    開封第一講書人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵俏拱,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我吼句,道長(zhǎng)锅必,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任命辖,我火速辦了婚禮况毅,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘尔艇。我一直安慰自己尔许,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開白布终娃。 她就那樣靜靜地躺著味廊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪棠耕。 梳的紋絲不亂的頭發(fā)上余佛,一...
    開封第一講書人閱讀 51,598評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音窍荧,去河邊找鬼辉巡。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蕊退,可吹牛的內(nèi)容都是我干的郊楣。 我是一名探鬼主播,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼瓤荔,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼净蚤!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起输硝,我...
    開封第一講書人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤今瀑,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體橘荠,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡屿附,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了砾医。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拿撩。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡衣厘,死狀恐怖如蚜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情影暴,我是刑警寧澤错邦,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站型宙,受9級(jí)特大地震影響撬呢,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜妆兑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一魂拦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧搁嗓,春花似錦芯勘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至棍矛,卻和暖如春安疗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背够委。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工荐类, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人茁帽。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓玉罐,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親脐雪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子厌小,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

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

  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問(wèn)題, 分享了一些自己做題目的經(jīng)驗(yàn)。 張土汪:刷leetcod...
    土汪閱讀 12,745評(píng)論 0 33
  • 我想战秋,我應(yīng)該就處于作者說(shuō)的那種狀態(tài)中:不滿足現(xiàn)狀璧亚,想要的很多,已有的又很少,陷入死循環(huán)然后永遠(yuǎn)無(wú)法進(jìn)步癣蟋,進(jìn)而越來(lái)越...
    蛀牙哼閱讀 151評(píng)論 0 0
  • 《金文誠(chéng)〈孟子〉學(xué)習(xí)筆記45公孫丑章句上1-6》 今天是丙申年丙申月壬午日透硝,七月廿六,2016年8月28日星期日疯搅。...
    金吾生閱讀 269評(píng)論 0 0
  • 窗外鶯兒啄綠頭濒生。 瞧酸勁嘀嘀兒啾。 醒來(lái)卻是惱春流幔欧。 無(wú)義人拋了長(zhǎng)袖罪治, 入了誰(shuí)的粉香樓。 沒(méi)頭沒(méi)腦把魂丟礁蔗。
    wan208閱讀 388評(píng)論 7 12
  • 最美的風(fēng)景不一定要在四月天 白云如煙絲的清晨 落霞乘著微風(fēng)的黃昏 點(diǎn)點(diǎn)星光閃爍的夜 我說(shuō)今晚的月亮很美 你說(shuō)是的 ...
    我的小兔子乖乖閱讀 183評(píng)論 0 0