那些年我们一起写过的代码2:回溯剪枝恢复现场

本文介绍了LeetCode中的四个编程问题:寻找子集的异或总和、全排列II、电话号码字母组合以及括号生成的解决方案,展示了递归和回溯在解决这类问题中的应用。
摘要由CSDN通过智能技术生成

1.78. 子集 - 力扣(LeetCode)

class Solution {
public:
vector<vector<int>>ret;
vector<int>path;
void solue(vector<int>&nums,int depth)
{
     ret.push_back(path);
    if(depth>=nums.size())
    {
        
        return ;
    }
    for(int i=depth;i<nums.size();i++)
    {
        path.push_back(nums[i]);
        solue(nums,i+1);
        path.pop_back();
    }
}
    vector<vector<int>> subsets(vector<int>& nums) {
solue(nums,0);
return ret;
    }
};

2.1863. 找出所有子集的异或总和再求和 - 力扣(LeetCode)

class Solution {
public:
int sum=0;
int path=0;
void solve(vector<int>&nums,int dipth)
{
     sum+=path;
    if(dipth>=nums.size())
    {
       
        return;
    }
    for(int i=dipth;i<nums.size();i++)
    {
        path=path^nums[i];
        solve(nums,i+1);
        path=path^nums[i];
    }
}

    int subsetXORSum(vector<int>& nums) {
solve(nums,0);
return sum;
    }
};

3.47. 全排列 II - 力扣(LeetCode)

class Solution {
public:
vector<vector<int>> ret;
vector<int>path;
bool check[9]={false};
void solve(vector<int>&nums,int depth)
{
if(nums.size()<=depth)
{
    ret.push_back(path);
    return;
}
for(int i=0;i<nums.size();i++)
{
    if(check[i]==false&&(i==0||nums[i]!=nums[i-1]||check[i-1]!=false))
    {
        path.push_back(nums[i]);
        check[i]=true;
        solve(nums,depth+1);
        check[i]=false;
        path.pop_back();
    }
}
}
    vector<vector<int>> permuteUnique(vector<int>& nums) {
    sort(nums.begin(),nums.end());
    solve(nums,0);
    return ret;
    }
};

4.17. 电话号码的字母组合 - 力扣(LeetCode)

 class Solution {
    public:
string good2[10]={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
vector<string>ret;
string path;
void solve(string digits,int depth)
{
    if(depth==digits.size())
    {
        ret.push_back(path);
        return;
    }
    for(auto ch:good2[digits[depth]-'0'])
    {
        path.push_back(ch);
        solve(digits,depth+1);
        path.pop_back();
    }
}
    vector<string> letterCombinations(string digits) {
if(digits.size()==0)
{
    return ret;
}
solve(digits,0);
return  ret;
    }
};

5.22. 括号生成 - 力扣(LeetCode)

class Solution {
public:
vector<string>ret;
string path;
int left=0;
int right=0;
void solve(int n)
{
    if(left==n&&right==n)
    {
        ret.push_back(path);
        return ;
    }
    if(left<n)
    {
        left++;
        path.push_back('(');
        solve(n);
        left--;
        path.pop_back();
    }
    if(right<left&&right<n)
    {
        right++;
        path.push_back(')');
        solve(n);
        right--;
        path.pop_back();
    }
}

    vector<string> generateParenthesis(int pn) {
    solve(pn);
    return ret;

    }
};

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值