Leetcode 40 Combination Sum II 结果去重问题

来源:8-5 回溯法解决组合问题的优化

乐事香浓番茄味

2019-06-08

在这道题中我在最终结果中又遍历了一遍进行去重,虽然accept但是性能较差,想请老师简单提一下在递归中去重的思路,谢谢!

具体来说,leetcode 39 Combination Sum 的去重方式我已经明白,但是本题允许有重复元素,以 candidates = [2,5,2,1,2], target = 5 为例,对2进行去重时,我的程序运行结果要么没达到去重目的:出现了两个 [1,2,5],要么把带有重复元素的合法解过滤掉了,漏掉了[1,2,2],希望老师提供一下去重的正确思路,谢谢!

写回答

2回答

liuyubobobo

2019-06-08

首先,对所有元素进行排序。


之后,在递归回溯的过程中,加入一个限制条件,不对重复元素进行搜索。对应我的题解代码:https://github.com/liuyubobobo/Play-Leetcode/blob/master/0040-Combination-Sum-II/cpp-0040/main.cpp 37,38两行。


如果不能理解为什么这两行起到了去重目的(同时也没有遗漏),建议用一个小数据量跟踪一下整个程序,看看程序运行过程中,是如何避免重复的。你举的例子就特别好。andidates = [2,5,2,1,2], target = 5 只有5个元素,足够看出问题:)


加油!:)

0
1
乐事香浓番茄味
非常感谢!
2019-06-08
共1条回复

乐事香浓番茄味

提问者

2019-06-08

if(i > index && candidates[i] == candidates[i-1])    
continue;

根据老师的代码,去重逻辑在这两行,这段逻辑可以这样理解:

一种是带有重复元素的合法解,比如[1,2,2],是需要保留的,在代码中第二个2是进入下一次递归所得,此时 i = index,符合逻辑

另一种是有重复解,比如candidates = [1,2,2,5],target = 5,没有去重会得到两个 [1,2,5],得到第一次 [1,2,5] 之后,for 循环会继续找到第二个 2,这时如果发现重复就需要跳过

0
1
liuyubobobo
大赞!继续加油!:)
2019-06-09
共1条回复

玩转算法面试-- Leetcode真题分门别类讲解

课程配套大量BAT面试真题,高频算法题解析,强化训练

7410 学习 · 1150 问题

查看课程