所谓排列,是指从给定的元素序列中依次取出元素,需要考虑取出顺序。比如,取出元素3, 5,因取出顺序的不同,则形成的序列{3, 5}与{5, 3}是不同的排列序列。对于长度为n的元素序列取出k个元素,则共有A(n, k)种取法。所谓组合,也是从元素序列中依次取出元素,与排列不同的是不需要考虑取出顺序;因此其取法数为C(n, k)。
LeetCode有两个问题分属于组合、排列:77. Combinations 与 46. Permutations。
组合
要求给出对于序列1~n 的取出k个元素的各种取法。采用DFS模拟组合时,可看做节点i与节点j(j = i+1, … , n)都相连接,然后DFS遍历整张有向图,代码实现如下:
public List<List<Integer>> combine(int n, int k) {
List<List<Integer>> result = new ArrayList<>();
if (n
本文探讨了如何使用深度优先搜索(DFS)算法解决排列和组合问题。在组合中,从1到n的序列中取出k个元素,不考虑顺序,DFS通过模拟有向图进行遍历。而在排列问题中,DFS需考虑所有可能的顺序,形成完全连通图。通过DFS和visit数组,可以有效地优化算法,降低时间复杂度。
订阅专栏 解锁全文
1417

被折叠的 条评论
为什么被折叠?



