用DFS(广度优先遍历)解决组合问题

该博客探讨如何使用深度优先搜索(DFS)解决组合问题,强调在解题时的剪枝处理,以避免重复子集。内容涵盖无重复元素和有重复元素的情况,并通过LeetCode上的两个经典题目(77. 组合和90. 含有相同元素的子集)进行示例说明。
摘要由CSDN通过智能技术生成

从元素集中选取几个元素构成子集,求解可以构成子集的数目,与排列的主要区别是子集中元素顺序不同视为同一个子集

解题思路:

  1. 解题时要注意进行剪枝处理,与排列问题解法的区别是对每次迭代要重新设置起始值,避免出现添加了之前的元素造成顺序不同的同一个子集被添加到答案中的情况。
  2. 如果没有重复元素,不需要用数组对访问过的元素进行标记,因为剪枝过程可以避免访问到之前的添加过的元素。
  3. 如果有重复元素,需要对原始数组进行排序,每次遍历元素需要标记,因为需要判断重复元素和第一个出现的元素是否同时出现在一个子集中,如果没有,这个重复元素可以跳过。

LeetCode上经典应用题目:
77 组合(没有重复元素)
输入:n = 4 , k = 2
输出:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]

public List<List<Integer>> combine(int n, int k) {
    List<List<Integer>> combinations = new ArrayList<>();
    List<Integer> combineList = new ArrayList<>();
    backtracking(combineList, combinations, 1, k, n);
    return combinations;
}

private void backtracking(List<Integer> combineList, List<List<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值