首页 > 编程语言 >算法训练day29 LeetCode 39.40.131

算法训练day29 LeetCode 39.40.131

时间:2023-10-08 23:12:17浏览次数:49  
标签:day29 target int sum 39.40 131 vector candidates path

算法训练day29 LeetCode 39.40.131

39.组合总和

题目

39. 组合总和 - 力扣(LeetCode)

题解

代码随想录 (programmercarl.com)

  • class Solution
    {
    private:
        vector<vector<int>> result;
        vector<int> path;
        void backtracking(vector<int> &candidates, int target, int sum, int startIndex)
        {
            if (sum > target)
                return;
            if (sum == target)
            {
                result.push_back(path);
            }
            for (int i = startIndex; i < candidates.size(); i++)
            {
                sum += candidates[i];
                path.push_back(candidates[i]);
                backtracking(candidates, target, sum, i);
                sum -= candidates[i];
                path.pop_back();
            }
        }
    
    public:
        vector<vector<int>> combinationSum(vector<int> &candidates, int target)
        {
            result.clear();
            path.clear();
            backtracking(candidates, target, 0, 0);
            return result;
        }
    };
    
  • 在sum>target时,依然会进入下一层循环,所以可以添加一个剪枝

  •     void backtracking(vector<int> &candidates, int target, int sum, int startIndex)
        {
           // if (sum > target)
           //     return;
            if (sum == target)
            {
                result.push_back(path);
                return;
            }
            for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; i++) //剪枝
            {
                sum += candidates[i];
                path.push_back(candidates[i]);
                backtracking(candidates, target, sum, i);
                sum -= candidates[i];
                path.pop_back();
            }
        }
    

40.组合总和II

题目

40. 组合总和 II - 力扣(LeetCode)

题解

代码随想录 (programmercarl.com)

  • candidates 中元素重复、单个结果中元素可以重复、总结果集中不能有结果重复

  • 需要去重 ---> 将组合的形式以树形结构组织

    • 单个结果元素可重复 ---> 单次组合(单枝)中不需要去重
    • 多个结果之间不能重复 ---> 不同次组合(同一层)中需要去重 ---> 将元素排序之后组合实现去重
  • class Solution
    {
    private:
        vector<vector<int>> result;
        vector<int> path;
        void backtracking(vector<int> &candidates, int target, int sum, int startIndex, vector<bool> used)
        {
            if (sum == target)
            {
                result.push_back(path);
                return;
            }
            for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; i++)
            {
                if (i > 0 && candidates[i] == candidates[i - 1] && used[i - 1] == false) //同层去重
                    continue;
                sum += candidates[i];
                path.push_back(candidates[i]);
                used[i] = true;
                backtracking(candidates, target, sum, i + 1, used);
                used[i] = false;
                sum -= candidates[i];
                path.pop_back();
            }
        }
    
    public:
        vector<vector<int>> combinationSum2(vector<int> &candidates, int target)
        {
            vector<bool> used(candidates.size(), false);
            result.clear();
            path.clear();
            sort(candidates.begin(), candidates.end());
            backtracking(candidates, target, 0, 0, used);
            return result;
        }
    };
    

131.分割回文串

题目

131. 分割回文串 - 力扣(LeetCode)

题解

代码随想录 (programmercarl.com)

  • 递归用来纵向遍历,for循环用来横向遍历,切割线(就是图中的红线)切割到字符串的结尾位置,说明找到了一个切割方法。

  • class Solution
    {
    private:
        vector<vector<string>> result;
        vector<string> path;
        bool isPalindrome(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;
        }
        void backtracking(const string &s, int startIndex)
        {
            if (startIndex >= s.size())
            {
                result.push_back(path);
                return;
            }
            for (int i = startIndex; i < s.size(); i++)
            {
                if (isPalindrome(s, startIndex, i))
                {
                    string str = s.substr(startIndex, i - startIndex + 1);
                    path.push_back(str);
                }
                else
                    continue;
                backtracking(s, i + 1);
                path.pop_back();
            }
        }
    
    public:
        vector<vector<string>> partition(string s)
        {
            result.clear();
            path.clear();
            backtracking(s, 0);
            return result;
        }
    };
    

标签:day29,target,int,sum,39.40,131,vector,candidates,path
From: https://www.cnblogs.com/High-source/p/17750427.html

相关文章

  • # 2023-2024-1 20231311《计算机基础与程序设计》第2周学习总结
    作业信息这个作业属于哪个课程https://edu.cnblogs.com/campus/besti/2023-2024-1-CFAP这个作业要求在哪里https://edu.cnblogs.com/campus/besti/2023-2024-1-CFAP/homework/12998这个作业的目标自学教材,计算机科学概论第1章并完成云班课测试,《C语言程序设计》第1......
  • 2023-2024-1 学号20231318《计算机基础与程序设计》第二周学习总结
    作业信息这个作业属于哪个课程2022-2023-1-计算机基础与程序设计这个作业要求在哪里2022-2023-1计算机基础与程序设计第一周作业这个作业的目标计算机科学概论第1章,《C语言程序设计》第1章,云班课测试作业正文2023-2024-1学号20231318《计算机基础与程序设计》......
  • 2023-2024-1 20231314《计算机基础与程序设计》第2周学习总结
    2023-2024-120231314《计算机基础与程序设计》第2周学习总结作业信息这个作业属于哪个课程<班级的链接>((https://edu.cnblogs.com/campus/besti/2022-2023-1-CFAP))这个作业要求在哪里(2022-2023-1计算机基础与程序设计第二周作业)这个作业的目标《计算机科学概论......
  • 2023-2024-1 20231312 《计算机基础与程序设计》第二周学习总结
    作业信息|这个作业属于哪个课程|<班级的链接>2023-2024-1-计算机基础与程序设计||这个作业要求在哪里|<作业要求链接>2023-2024-1计算机基础与程序设计第二周作业||这个作业的目标|<计算机科学概论第1章并完成云班课测试《C语言程序......
  • CF131D Subway 题解
    题目传送门前置知识强连通分量|最短路解法考虑用Tarjan进行缩点,然后跑最短路。缩点:本题的缩点有些特殊,基于有向图缩点修改而得,因为是无向图,所以在Tarjan过程中要额外记录一下从何处转移过来,防止在同一处一直循环。基环树上找环还有其他方法,这里仅讲解使用Tarjan求......
  • 2023-2024-1 学号20231315《计算机基础与程序设计》第二周学习总结
    学期:2023-2024-1学号:20231315《计算机基础与程序设计》第二周学习总结作业信息这个作业属于哪个课程2023-2024-1《计算机基础与程序设计》这个作业要求在哪里2023-2024-1《计算机基础与程序设计》这个作业的目标学习计算机科学概论第1章和《C语言程序设计》第1......
  • 学年2023-2024-1 学号 20231310《计算机基础与程序设计》第二周学习总结
    作业信息这个作业属于哪个课程https://www.cnblogs.com/rocedu/p/9577842.html这个作业要求在哪里https://www.cnblogs.com/rocedu/p/9577842.html#WEEK02这个作业的目标《计算机科学概论》和《C语言程序设计》第1章并完成云班课测试作业正文https://www.cn......
  • 2023-2024-1 20211319《信息安全专业导论》第二周学习总结
    2021-2022-120211408《信息安全专业导论》第周学习总结作业信息这个作业属于哪个课程<班级的链接>(如2023-2024-1-计算机基础与程序设计)这个作业要求在哪里https://www.cnblogs.com/rocedu/p/9577842.html#WEEK02这个作业的目标<写上具体方面>作业正文.........
  • 1113123131
    //#include<bits/stdc++.h>//usingnamespacestd;//intmain(){// inta,b,c;// scanf("%d%d%d",&a,&b,&c);// cout<<setw(8)<<a<<""<<setw(8)<<b<<""<<setw(8)<<......
  • 2023-2024-1 20231314许城铭 《计算机基础与程序设计》第一周学习总结
    2023-2024-120231314许城铭《计算机基础与程序设计》第一周学习总结作业信息这个作业属于哪个课程(2022-2023-1-计算机基础与程序设计)这个作业要求在哪里(2022-2023-1计算机基础与程序设计第一周作业)这个作业的目标<简单浏览《计算机科学概论》,并尝试提出问题以......