77. 组合

tech2024-01-22  72

1.题目描述

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

2.回溯法

比如输入 n = 4, k = 2,输出如下结果,顺序无所谓,但是不能包含重复(按照组合的定义,[1,2] 和 [2,1] 也算重复): [ [1,2], [1,3], [1,4], [2,3], [2,4], [3,4] ] k 限制了树的高度,n 限制了树的宽度

3.代码

class Solution { public: vector<vector<int>> combine(int n, int k) { vector<vector<int>> res; if(n <= 0 || k <= 0){ return res; } vector<int> track; backTrack(track, res, n, k, 1); return res; } void backTrack(vector<int>& track, vector<vector<int>>& res, int n, int k, int start){ if(track.size() == k){ res.push_back(track); return; } for(int i = start; i <= n; ++i){ track.push_back(i); backTrack(track, res, n, k, i + 1); track.pop_back(); } } };

4.复杂度分析

时间复杂度 : O ( k C N k ) O(k C_N^k) O(kCNk),其中 C N k = N ! ( N − k ) ! k ! C_N^k = \frac{N!}{(N - k)! k!} CNk=(Nk)!k!N!是要构成的组合数。 空间复杂度 : O ( C N k ) O(C_N^k) O(CNk)

最新回复(0)