摘要:回溯法復雜度時間空間思路通過深度優(yōu)先搜索,回溯出所有可能性即可。而遞歸的條件是當或者時,返回一個空列表。注意當返回的是空列表時,要加一個空列表進去,否則循環(huán)會被跳過代碼加入一個空列表,防止跳過循環(huán)
Combinations
回溯法 復雜度Given two integers n and k, return all possible ombinations of k numbers out of 1 ... n.
For example, If n = 4 and k = 2, a solution is:
[ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ]
時間 O(N) 空間 O(K)
思路通過深度優(yōu)先搜索,回溯出所有可能性即可。
代碼public class Solution { List公式法 復雜度> res = new ArrayList
>(); public List
> combine(int n, int k) { dfs(1, k, n, new ArrayList
()); return res; } private void dfs(int start, int k, int n, List tmp){ // 當已經(jīng)選擇足夠數(shù)字時,將tmp加入結(jié)果 if(k == 0){ res.add(new ArrayList (tmp)); } // 每一種選擇數(shù)字的可能 for(int i = start; i <= n; i++){ tmp.add(i); dfs(i + 1, k - 1, n, tmp); tmp.remove(tmp.size() - 1); } } }
時間 O(N) 空間 O(N)
思路在數(shù)學中,組合數(shù)有這么一個性質(zhì) 當C(n-1,k-1)返回的是空列表時,要加一個空列表進去,否則for循環(huán)會被跳過
$$ C_{n}^{k}=C_{n-1}^{k-1}cup n+C_{n-1}^{k}$$
所以,我們可以分別求出C(n-1,k-1)和C(n-1,k),并將前者都加上n,最后將兩個結(jié)果和到一起,就是C(n,k)。而遞歸的Base條件是當n=0,k=0或者npublic class Solution {
public List
> combine(int n, int k) {
// Recursion: C(n, k) = C(n-1, k-1) U n + C(n-1, k)
// Base: C(0, k) C(n, 0) n < k ---> empty
List
> res = new LinkedList
>();
if(n < k || n == 0 || k == 0){
return res;
}
// C(n-1, k-1) U n
List
> temp = combine(n-1, k-1);
List
> part1 = new LinkedList
>();
// 加入一個空列表,防止跳過for循環(huán)
if(temp.isEmpty()){
List
> part2 = combine(n-1, k);
res.addAll(part1);
res.addAll(part2);
return res;
}
}
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/64529.html
摘要:深度優(yōu)先搜索復雜度時間空間遞歸棧空間思路因為我們可以任意組合任意多個數(shù),看其和是否是目標數(shù),而且還要返回所有可能的組合,所以我們必須遍歷所有可能性才能求解。這題是非常基本且典型的深度優(yōu)先搜索并返回路徑的題。本質(zhì)上是有限深度優(yōu)先搜索。 Combination Sum I Given a set of candidate numbers (C) and a target number (...
摘要:和唯一的不同是組合中不能存在重復的元素,因此,在遞歸時將初始位即可。 Combination Sum I Problem 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...
摘要:再在前一種情況下繼續(xù)下一輪的遍歷,并將結(jié)果添加到隊列末尾。思路二遞歸其實,通過遞歸的方法我們也可以在前一輪的基礎(chǔ)上進行下一輪的計算。 題目要求 Given two integers n and k, return all possible combinations of k numbers out of 1 ... n. For example, If n = 4 and k = 2...
摘要:題目描述題目理解將一段字符廣度搜索截取,分別有種組合形式,添加限制條件,過濾掉不適合的組合元素。長度,大小,首字母應(yīng)用如果進行字符串的子元素組合窮舉,可以應(yīng)用。所有的循環(huán),利用到前一個狀態(tài),都可以理解為動態(tài)規(guī)劃的一種分支 題目描述:Given a string containing only digits, restore it by returning all possible va...
摘要:而按鍵和字母的對應(yīng)關(guān)系如上圖。這將成為下一次操作的前序字符串。對于每一個不同的前序字符串,我們都要在其后面分別加上當前鍵所表示的不同字符,再將獲得的結(jié)果字符串加入里面。 題目詳情 Given a digit string, return all possible letter combinations that the number could represent. mapping o...
閱讀 3028·2021-09-08 10:43
閱讀 1031·2019-08-30 15:53
閱讀 965·2019-08-30 13:51
閱讀 836·2019-08-29 14:03
閱讀 796·2019-08-26 18:35
閱讀 1229·2019-08-26 13:38
閱讀 1580·2019-08-26 10:34
閱讀 3497·2019-08-26 10:21