leetcode40-组合总和II

leetcode 40

思路

在做本题之前可以参考之前的文章:组合总和组合总和III

本题的关键点是:每个元素只能使用一次,另外本题给的数组是无序的,并且元素之间可能存在重复项,举个例子,candidates = [1,2,1,1],这种可能性存在,所以本题的关键在于去重

假设candidates = [1,2,1,1], target = 3 可能的情况是:[1,2], [1,1,1]

也就是说元素每个元素1都是一个单独的元素,这里三个1可以组合成一个满足条件的答案,但是[1,2]这个组合最终只能有一个,我们可能看到这个题的时候最开始的想法是想通过普通的组合总和的方式拿到所有结果以后再去重,但是最后来进行去重工作量大,并且不容易通过leetcode的时间校验,所以最好的方式是在遇到重复的时候就进行排除

我们首先对其进行排序,排序后得到的结果[1,1,1,2]

然后我们先从第一个元素1开始拿到值以后放入path中,加入后续的元素形成组合,当遇到path = [1,1,1]的时候说明拿到了结果放入result中,后续通过回溯pop之后path = [1]再把2加入,得到path = [1,2]满足条件,放入result中此时第一层i = 0的元素已经与后续元素都组合完成,现在要更新startIndex = 1,遍历第二层i = 1,但是我们发现这个元素仍然为11和后续元素的所有可能形成的组合在前一个元素那里已经组合过一次了 ,所以需要去重。于是我们判断当candidates[i] === candidates[i-1]时,也就是下一个元素等于上一个元素的时候,我们要跳过,但是如果这样写的话只要遇到相同元素都会跳过,此时就会把[1,1,1]这个答案排除在外,所以需要再加上一个条件,只有当层级遍历中的下一个元素和上一层的元素相等的时候,才跳过,所以需要i > startIndex

这里如果想不通的话可以用vscode的debugger模式调试一下,看看每一步的过程是什么时候进行跳过的

实现

js 复制代码
var combinationSum2 = function (candidates, target) {
    // 排序-从小到大
    candidates = candidates.sort((a, b) => a - b);
    let result = [], path = [], sum = 0;
    const backtracking = (candidates, target, startIndex) => {
        if (sum === target) {
            result.push([...path])
            return
        }
        if (sum > target) return
        for (let i = startIndex; i < candidates.length; i++) {
            // 新的一层中存在和上一层元素相同,需要去重
            if(i > startIndex && candidates[i] === candidates[i-1]) continue;
            path.push(candidates[i])
            sum += candidates[i]
            backtracking(candidates,target,i+1)
            sum -= path.pop()
        }
    }
    backtracking(candidates, target, 0)
    return result
};
相关推荐
Filotimo_4 分钟前
3.5 排序算法
数据结构·算法·排序算法
一个努力编程人5 分钟前
机器学习————GBDT算法
人工智能·算法·机器学习
敲代码的约德尔人5 分钟前
我在 3 个项目中踩坑后,才真正理解了 JavaScript 设计模式
前端·javascript
深圳市恒星物联科技有限公司6 分钟前
基于图像识别算法与积水传感器的积水监测预警技术方案
人工智能·算法
liu****7 分钟前
1.反向迭代器实现思路
数据结构·c++·反向迭代器·vector·list
Highcharts.js7 分钟前
Highcharts时间线图(Timeline Chart)完全指南:事件序列的可视化叙事图表
javascript·信息可视化·数据分析·highcharts·图表开发·时间线图表
小美单片机13 分钟前
Proteus8.9安装保姆级教程
c语言·c++·算法·51单片机·proteus·大一新生
white-persist21 分钟前
【红队渗透】Cobalt Strike(CS)红队详细用法实战手册
java·网络·数据结构·python·算法·安全·web安全
Project_Observer24 分钟前
任务条件布局规则如何帮助自动管理任务?
大数据·数据结构·人工智能·深度学习·机器学习·编辑器
舟舟亢亢29 分钟前
算法总结—【动态规划一维、二维、状态压缩】
算法·动态规划