题目描述:
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], ]
解题思路:
这题我的思路是运用递归将数组中的元素逐个挑出来重新组成一个数组,因为这个数组是1到n按顺序排列的,所以只要把上一次添加的数组元素+1就是这次添加的最小的元素了,又因为题目有要求按升序排列,而且不能重复,所以能添加的最大元素只能是n-k+目前数组的长度+1。
最后当数组元素个数等于k时,把这个数组添加到二维数组中。
代码:
class Solution { public: void addAll(vector<vector<int>> &ret, vector<int> nums, int &k, int &n, int index){ if(index == k) ret.push_back(nums); else if(index == 0){ //第一次添加数组中没有元素,所以要独立出来 for(int i = 1; i <= n-k+1; i++){ nums[index] = i; addAll(ret, nums, k, n, index+1); } } else{ for(int i = nums[index-1]+1; i <= n-k+index+1; i++){ nums[index] = i; addAll(ret, nums, k, n, index+1); } } } vector<vector<int>> combine(int n, int k) { vector<vector<int>> ret; if(n < k || k < 1) return ret; vector<int> nums(k, 0); addAll(ret, nums, k, n, 0); return ret; } };