第26天-回溯-第七章 ● 39. 组合总和 ● 40.组合总和II ● 131.分割回文串

news/2024/6/16 2:13:37 标签: leetcode, 算法, 动态规划

文章目录

  • 1. 组合总和 (结果集中可以有重复的元素)
  • 2.组合总和|| (去重)
  • 3.分割回文串 (第一次没懂)

1. 组合总和 (结果集中可以有重复的元素)

- LeetCode链接

给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。
candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。
对于给定的输入,保证和为 target 的不同组合数少于 150 个

class Solution {
public:

    vector<vector<int>> result;
    vector<int> path;

    void backtracking(vector<int>& candidates, int target, int startIndex){
        if(target == 0){
            result.push_back(path);
            return ;    
        }else if(target < 0){
            return ;
        }

        for(int i=startIndex; i<candidates.size(); i++){
            path.push_back(candidates[i]);
            backtracking(candidates, target-candidates[i], i);
            path.pop_back();
        }
    }

    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        result.clear();
        path.clear();

        backtracking(candidates, target, 0);
        return result;
    }
};

2.组合总和|| (去重)

- LeetCode链接

给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的每个数字在每个组合中只能使用 一次 。
注意:解集不能包含重复的组合。

class Solution {
public:
    
    vector<vector<int>> result;
    vector<int> path;

    void backtracking(vector<int>& candidates, int target, int startIndex, vector<bool> used){
        if(target < 0) return ;
        else if(target == 0){
            result.push_back(path);
            return;
        }

        for(int i=startIndex; i<candidates.size() && target-candidates[i] >= 0; i++){
            
            if(i > 0 && candidates[i] == candidates[i-1] && used[i-1]==false){
                continue;
            }

            path.push_back(candidates[i]);
            used[i] = true;
            backtracking(candidates, target-candidates[i], i+1, used);
            used[i] = false;
            path.pop_back();
        }
    }

    vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
        result.clear();
        path.clear();

        vector<bool> used(candidates.size(), false);

        sort(candidates.begin(), candidates.end());
        backtracking(candidates, target, 0, used);

        return result;
    }
};

3.分割回文串 (第一次没懂)

- LeetCode链接

给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。
回文串 是正着读和反着读都一样的字符串。

class Solution {
public:
    vector<vector<string>> result;
    vector<string> path;

    bool judgePart(const string& s, int start, int end){
        for(int i=start, j=end; i<j; i++, j--){
            if(s[i] != s[j]){
                return false;
            }
        }
        return true;
    }

    // 1. 确定参数和返回值
    void backtracking(string& s, int startIndex){
        // 2. 确定递归终止条件
        if(startIndex >= s.size()){
            result.push_back(path);
            return;
        }

        // 3. 单层逻辑
        for(int i=startIndex; i<s.size(); i++){
            if(judgePart(s, startIndex, i)){        
                string str = s.substr(startIndex, i-startIndex+1);
                path.push_back(str);
            }else{
                continue;
            }

            backtracking(s, i+1);
            path.pop_back();
        }
    }

    vector<vector<string>> partition(string s) {
        result.clear();
        path.clear();
        backtracking(s, 0);
        return result;
    }
};

http://www.niftyadmin.cn/n/220633.html

相关文章

2023/4/13总结

最小生成树 一、Prim算法 1.prim算法也被称为“加点法”&#xff0c;因为该算法是先从任意一顶点出发不断的选择目前距离最近且未被选择的点加入到已选的集合中&#xff0c;直到所有的点都被选到。&#xff08;和最短路径中的Dijkstra算法很像&#xff09; 2.prim算法的实现…

如何使用Socks5代理IP提高网络安全性

随着网络的快速发展&#xff0c;网络安全问题变得越来越重要。为了保障网络安全&#xff0c;人们普遍使用代理IP&#xff0c;其中Socks5代理IP是一种常用的选择。本文将介绍什么是Socks5代理IP&#xff0c;以及如何使用它提高网络安全性。 一、什么是Socks5代理IP Socks5代…

Elasticsearch:使用 ingest pipeline 来管理索引名称

在我之前的文章 “Elasticsearch&#xff1a;使用 pipelines 路由文档到想要的 Elasticsearch 索引中去” 我详述了如何使用已有的 date_index_name 处理器来把文档归类到所需要的和文档日期相关的的索引中去。比如&#xff0c;我们想把 2023 年 4 月的所有文档写入到 my-index…

WuThreat身份安全云-TVD每日漏洞情报-2023-04-14

漏洞名称:SecurePoint UTM 信息泄露 漏洞级别:严重 漏洞编号:CVE-2023-22620 相关涉及:SecurePoint UTM < 12.2.5.1 漏洞状态:POC 参考链接:https://tvd.wuthreat.com/#/listDetail?TVD_IDTVD-2023-09257 漏洞名称:3CX 桌面应用程序权限提升 漏洞级别:中危 漏洞编号:CVE-…

BGP基础知识

今天海翎光电的小编主要介绍一下BGP的相关基础知识&#xff0c;文章浅显易懂&#xff0c;适合对BGP完全没有了解的同学。 BGP介绍 边界网关协议BGP&#xff08;Border Gateway Protocol&#xff09;是一种实现自治系统AS&#xff08;Autonomous System&#xff09;之间的路由可…

神经网络参数初始化方法 | 深度学习

为什么需要初始化神经网络参数&#xff1f; 神经网络参数的初始值会影响网络的拟合能力和优化效果&#xff0c;如果初始值过大或过小&#xff0c;可能会使得模型的梯度爆炸或梯度消失&#xff0c;导致网络无法收敛或训练效率低下。因此&#xff0c;合适的参数初始化可以提高模…

【C++】哈希应用:位图 哈希切分 布隆过滤器

我走后&#xff0c;他们会给你们加班费&#xff0c;会给你们调休&#xff0c;这并不是他们变好了&#xff0c;而是因为我来过。------龙哥 文章目录一、位图1.位图概念2.位图实现及测试3.位图应用和面试题二、哈希切分&#xff08;hashfunc 除留余数法 控制切分的范围&#x…

逻辑回归预测泰坦尼克号乘客生存率

逻辑回归预测泰坦尼克号乘客生存率 描述 RMS泰坦尼克号的沉没是历史上最臭名昭着的沉船之一。1912年4月15日&#xff0c;在她的处女航中&#xff0c;泰坦尼克号在与冰山相撞后沉没&#xff0c;在2224名乘客和机组人员中造成1502人死亡。这场耸人听闻的悲剧震惊了国际社会&…