題目:
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, a solution is:
[ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ]
題解:
這道題就是用DFS(參考Work BreakII)的迴圈遞迴處理子問題的方法解決。n為迴圈的次數,k為每次嘗試的不同數字。用到了回溯。
程式碼如下:
1 public ArrayList<ArrayList<Integer>> combine(int n, int k) {
2 ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
3 if(n <= 0||n < k)
4 return res;
5 ArrayList<Integer> item = new ArrayList<Integer>();
6 dfs(n,k,1,item, res);//because it need to begin from 1
7 return res;
8 }
9 private void dfs(int n, int k, int start, ArrayList<Integer> item, ArrayList<ArrayList<Integer>> res){
10 if(item.size()==k){
11 res.add(new ArrayList<Integer>(item));//because item is ArrayList<T> so it will not disappear from stack to stack
12 return;
13 }
14 for(int i=start;i<=n;i++){
15 item.add(i);
16 dfs(n,k,i+1,item,res);
17 item.remove(item.size()-1);
18 }
19 }
2 ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
3 if(n <= 0||n < k)
4 return res;
5 ArrayList<Integer> item = new ArrayList<Integer>();
6 dfs(n,k,1,item, res);//because it need to begin from 1
7 return res;
8 }
9 private void dfs(int n, int k, int start, ArrayList<Integer> item, ArrayList<ArrayList<Integer>> res){
10 if(item.size()==k){
11 res.add(new ArrayList<Integer>(item));//because item is ArrayList<T> so it will not disappear from stack to stack
12 return;
13 }
14 for(int i=start;i<=n;i++){
15 item.add(i);
16 dfs(n,k,i+1,item,res);
17 item.remove(item.size()-1);
18 }
19 }
Reference:http://blog.csdn.net/linhuanmars/article/details/21260217