Leetcode 77. 组合

题目:

给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合。

示例:

输入: n = 4, k = 2
输出:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]

解答:

回溯算法

Python:

 1 class Solution:
 2     def combine(self, n: int, k: int):
 3         res=[]
 4         cur=[]
 5         self.recur(n,k,1,res,cur)
 6         return res
 7     def recur(self,n,k,cur_index,res,cur):
 8         if len(cur)==k:
 9             res.append(cur[:])    //注意深拷贝
10             return
11         for i in range(cur_index,n+1):
12             cur.append(i)
13             self.recur(n,k,i+1,res,cur)
14             cur.pop()

 


C++:

 1 class Solution {
 2 public:
 3     vector<vector<int>> combine(int n, int k) {
 4         vector<vector<int>> res;
 5         vector<int> cur;
 6         func(res,cur,1,n,k);
 7         return res;
 8     }
 9     void func(vector<vector<int>>& res,vector<int>& cur,int nex,const int& n,const int& k){
10         if(cur.size()==k){res.push_back(cur);return;}
11         if(n-nex+1<k-cur.size()){return;}//剪枝:剩下的数字全用上,数组长度也达不到K
12         if(nex<=n){
13             cur.push_back(nex);//包含nex的
14             func(res,cur,nex+1,n,k);
15             cur.pop_back();//不包含nex
16             func(res,cur,nex+1,n,k);
17         }
18     }
19 };

 

posted @ 2019-05-22 19:53  NeoZy  阅读(86)  评论(0编辑  收藏  举报