由leetcode39. 组合总和看搜索去重问题 & 搜索排列组合(排列组合去重总结)

由leetcode39. 组合总和看搜索去重问题 & 搜索排列组合

今天一刷随想录,把组合一起做完了,有一些个人的想法,顺便好像是也思考到了排列,因为还没做排列题等做完排列再来修改这篇文章。

关于回溯基础和组合在这里 https://blog.csdn.net/m0_50470999/article/details/122233727

先来看一下lc39

题目
给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。

candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。 

对于给定的输入,保证和为 target 的不同组合数少于 150 个。

开始我的错误想法,既然元素都可以重复,那么在横向的时候只要每次都从数组的最前面开始就好了(即没有index——把相同数组视为不同数组)

展示下错误代码

void backtracking(int[] candidates, int sum){
   
    if(sum < 0) return;
    if(sum == 0){
   
        res.add(new ArrayList(path));
        return;
    }
    for(int i = 0; i < candidates.length; i ++){
   
        // 剪枝
        if(candidates[i] > sum) continue;
        path.add(candidates[i]);
        backtracking(candidates, sum - candidates[i]);
        path.remove(path.size() - 1);
    }
}

得到结果如下

在这里插入图片描述

我意识到这是排列,而不是组合,可是为什么横向使用重复数字不能达到题目的效果呢?

首先画出我的搜索树

在这里插入图片描述

已经可以看出[2,5]和[5,2]已经重复了。对比卡哥的树

39.组合总和

可以看出卡哥的树是有序的,横向时是从左向右的,这时可以去除掉排列产生的重复。

联想小时候学数线段的时候,都是从左往右数,因为线段是无方向的,就好像这里的组合一样。因此这道题的正确代码如下

class Solution {
   
    List<List<Integer>> res = new ArrayList<>();
    List<Integer> path <
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值