40-组合总和2(回溯算法)

news/2024/7/7 21:16:47

题目

给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的每个数字在每个组合中只能使用 一次 。
注意:解集不能包含重复的组合。
示例 1:
输入: candidates = [10,1,2,7,6,1,5], target = 8,
输出:
[
[1,1,6],
[1,2,5],
[1,7],
[2,6]
]
示例 2:
输入: candidates = [2,5,2,1,2], target = 5,
输出:
[
[1,2,2],
[5]
]

分析

子集和组合类问题类似,区别是返回条件不一样,子集可继续生长无需返回,组合达到终止条件直接返回结果,或者不可能达到target提前终止.
至于终止条件可以类似于trace原因跟踪遍历过程
算法框架:

选择列表排序
路径列表
路径
target
void backtrack(选择列表) {
	if target 合格:
		路径列表.add(路径)
		return //组合
		//return //因为子集还能生长
	if target 不可能:
		return //提前终止
	for 选择 in 选择列表[start:]:
		if 选择 > start && 选择列表[选择]==选择列表[选择-1]:
			continue //与前一个相同的树枝剪掉
		路径.add(选择)
		target+=选择
		backtrack(选择列表,选择+1)
		路径.pop(选择) //重新进行下一个选择
		target-=选择
}

C++代码

class Solution {
private:
    vector<int> _trace;
    int _sum;
    vector<vector<int>> _results;
    void backtrack(const vector<int>& nums, const int& start,const int& target){
        if(_sum==target){
            _results.push_back(_trace);
            return;
        }
        if(_sum>target)
            return;//提前终止
        for(int i=start;i<nums.size();i++){
            if(i>start&& nums[i]==nums[i-1])
                continue;
            _trace.push_back(nums[i]);
            _sum+=nums[i];
            backtrack(nums,i+1,target);
            _trace.pop_back();
            _sum-=nums[i];
        }
    }
public:
    vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
        sort(candidates.begin(),candidates.end(),[](int a,int b){return a<b;});
        _sum=0;
        backtrack(candidates,0, target);
        return _results;
    }
};

http://lihuaxi.xjx100.cn/news/2063043.html

相关文章

06 OpenCV增加图像的对比度

文章目录 理论API代码 理论 图像变换可以看作如下&#xff1a; 像素变换 – 点操作邻域操作 – 区域 调整图像亮度和对比度属于像素变换-点操作 API saturate_cast(value)确保值大小范围为0~255之间Mat.at(y,x)[index]value 给每个像素点每个通道赋值 代码 #include <…

2024免费mac苹果电脑的清理和维护软件CleanMyMac X

对于 Mac 用户来说&#xff0c;电脑的清理和维护是一件让人头疼的事情。但是&#xff0c;有了 CleanMyMac X&#xff0c;这一切都将变得轻松愉快。CleanMyMac X 是一款专为 Mac 设计的电脑清理软件&#xff0c;它以其强大的功能和简单的操作&#xff0c;让无数用户为之倾倒。 C…

【未完结】nginx+hexo搭建个人网站真实体验!

自从之前学习Vue和SSM的时候写了个博客项目之后&#xff0c;就特别想做一个自己的博客网站。可能是出于拖延心理以及各种任务安排时间繁忙&#xff0c;一直没有抽时间去弄。博客笔记基本上都是直接使用csdn写的&#xff0c;除此之外&#xff0c;还经常在这些网站上写笔记&#…

蓝桥OJ 2942数字王国之军训排队 DFS剪枝

蓝桥OJ 2942数字王国之军训排队 #include<bits/stdc.h> using namespace std;const int N 15;//最多10队 int a[N], n; vector<int>v[N];//二维数组 v[i]记录队伍i中所有人的编号bool dfs(int cnt, int dep) {if (dep n1){//判断合法性for (int i 1; i < n; …

未来技术发展与情绪消除的可能性——探索人工智能对情绪调控的新路径

随着科技的飞速进步&#xff0c;特别是人工智能(AI)和神经科学领域的突破&#xff0c;关于是否存在一种未来机器能够消除人类情绪的问题引发了广泛的社会讨论与伦理思考。本文旨在探讨这一设想的可能性、潜在影响以及相关伦理挑战。 首先&#xff0c;从技术角度看&#xff0c;科…

5.40 BCC工具之ustat.py解读

一,工具简介 ustat是一个类似于“top”的工具,用于监控高级语言中的事件。它为每个使用Java、Node、Perl、PHP、Python、Ruby和Tcl运行时的进程打印关于垃圾收集、方法调用、对象分配以及各种其他事件的统计信息。 二,代码示例 #!/usr/bin/pythonfrom __future__ import …

腾讯云幻兽帕鲁游戏存档迁移教程,本地单人房迁移/四人世界怎么迁移存档?

腾讯云幻兽帕鲁游戏存档迁移的方法主要包括以下几个步骤&#xff1a; 登录轻量云控制台&#xff1a;首先&#xff0c;需要登录到轻量云控制台&#xff0c;这是进行存档迁移的前提条件。在轻量云控制台中&#xff0c;可以找到接收存档的服务器卡片&#xff0c;并点击进入实例详情…

简单了解GaussDB

大家都已经很熟悉openGauss了&#xff0c;昨天我的文章中说陕西电力的用采系统用Gaussdb替代了Oracle&#xff0c;就有朋友问我这个Gaussdb是不是就是openGauss。这个问题还真的有点不好回答&#xff0c;Gaussdb和openGauss渊源很近&#xff0c;但是还不是一码事。华为在数据库…