代码随想录算法训练营第二十二天|leetcode17、216题

本文讲述了如何使用回溯算法和递归来解决LeetCode中的第216题(找出k个数之和等于n的组合)和第17题(将2-9数字映射为字符串的组合)。两题都涉及到递归过程和剪枝策略的运用。

一、leetcode第216题

本题要找出相加之和为n的k个数的组合,这和上一篇的组合问题大同小异,也是运用回溯算法和递归相结合,在终止条件中要加上计算数组里的元素和这一操作,并且在剪枝操作中变为确定元素和是否大于n,若大于n则直接剪枝。

具体代码如下:

class Solution {
public:
    vector<int>tmp;
    vector<vector<int>>result;
    vector<vector<int>> combinationSum3(int k, int n) {
    backtracking(k,n,1,9);
    return result;
    }
    void backtracking(int k,int n,int start,int end)
    {
        int sum=0;
        for(int i=0;i<tmp.size();i++)
        {
            sum+=tmp[i];
        }
        if(sum>n)
        {
            return;
        }
        if(sum==n&&tmp.size()==k)
        {
            result.push_back(tmp);
            return;
        }
        for(int i=start;i<=end;i++)
        {
            tmp.push_back(i);
            backtracking(k,n,i+1,end);
            tmp.pop_back();
        }
    }
};

二、leetcode第17题

本题将2-9的数字映射为不同的字符串,也是将回溯算法和递归结合,基本思路与上题一致,不同之处在于加上了数字和字符串之间的映射,这使得二者之间要不停转变。首先构建string数组将数组和字符串对应起来,在递归过程中用index表示传入字符串的下标,通过对字符串下标对应数字的处理也处理了数字对应的不同字母将其进行组合,最后当访问字符串下标到最后一个字符之后时结束递归返回结果。

具体代码如下:

class Solution {
public:
    string st;
    vector<string>result;
    string mapletter[10]=
    {
        "",
        "",
        "abc",
        "def",
        "ghi",
        "jkl",
        "mno",
        "pqrs",
        "tuv",
        "wxyz",
    };
    vector<string> letterCombinations(string digits) {
    if(digits.length()==0)
    {
        return result;
    }
    backtracking(digits,0);
    return result;
    }
    void backtracking(string digits,int index)
    {
        if(index==digits.length())
        {
           result.push_back(st);
           return;
        }
        int digit=digits[index]-'0';
        string map=mapletter[digit];
        for(int i=0;i<map.length();i++)
        {
            st.push_back(map[i]);
            backtracking(digits,index+1);
            st.pop_back();
        }
    }
};

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值