代码随想录day27| 39. 组合总和、40.组合总和II、 131.分割回文串

39. 组合总和

可以重复的组合:
1.关键点:不用i+1了,表示可以重复读取当前的数
依然是需要startIndex的,否则就会是有序的排列
2.先排序,后剪枝:如果 sum + candidates[i] > target 就终止遍历

40.组合总和II (树枝去重与树层去重)

1.难点:集合(数组candidates)有重复元素,但还不能有重复的组合。
都知道组合问题可以抽象为树形结构,那么“使用过”在这个树形结构上是有两个维度的,一个维度是同一树枝上使用过,一个维度是同一树层上使用过。没有理解这两个层面上的“使用过” 是造成大家没有彻底理解去重的根本原因。

那么问题来了,我们是要同一树层上使用过,还是同一树枝上使用过呢?

回看一下题目,元素在同一个组合内是可以重复的,怎么重复都没事,但两个组合不能相同。

所以我们要去重的是同一树层上的“使用过”,同一树枝上的都是一个组合里的元素,不用去重。

为什么要树层去重?
例:[1,1,4,6,7] target=8
第一个1往后取的[1,7]必然会包含后面的1组成的[1,7]

2.先排序,后去重
3.初始化used数组:vector used(candidates.size(), false);

131.分割回文串

1.在单层递归中判断是否是回文,而不是在终止条件中判断,为什么呢
2.substr的用法:
substr(string, start, length)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值