代码随想录算法训练营第25天 |第七章 回溯算法part02

本文详细介绍了如何用C++实现LeetCode上的组合总和III和电话号码字母组合问题,包括backtracking算法的运用,错误修正和注意事项,如终止条件、回溯过程的正确性等。
摘要由CSDN通过智能技术生成

学习目标:

  • 216.组合总和III
  • 17.电话号码的字母组合

学习内容:

216.组合总和III

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

    void backtracking(int k,int targetsum, int sum, int startIndex){
        if(sum==targetsum && path.size()==k){
            result.push_back(path);
            return;
        }
        for(int i = startIndex;i<=9;i++)
        {
            sum+=i;
            path.push_back(i);
            backtracking(k,targetsum,sum,i+1); //写成startIndex+1了
            sum-=i; //忘记写这个了
            path.pop_back();
        }
    }

    vector<vector<int>> combinationSum3(int k, int n) {
        int startIndex = 1;
        int sum = 0;
        backtracking(k,n,sum,startIndex);
        return result;

    }
};

错误以及注意事项

  • backtracking(k,targetsum,sum,i+1); //写成startIndex+1了 写成startIndex+1的话实际上最后一个参数就一直没变,sum-=i是回溯撤销最后一步中必要的步骤,忘记写了!
  • 终止条件可以补上一个if (sum > targetsum || path.size() > k) return; // 终止条件,避免无限递归

17.电话号码的字母组合

class Solution {
public:
    const string letterMap[10] = {
        "", // 0
        "", // 1
        "abc", // 2
        "def", // 3
        "ghi", // 4
        "jkl", // 5
        "mno", // 6
        "pqrs", // 7
        "tuv", // 8
        "wxyz", // 9
    };
    string s;
    vector<string> result;

    void backtracking(string digits, int index){
        //终止条件
        if(index == digits.size())
        {
            result.push_back(s);
            return;
        }
        //单层遍历
        int digit = digits[index]-'0';
        string letter = letterMap[digit];
        for(int i=0;i<letter.size();i++){
            s.push_back(letter[i]);
            backtracking(digits,index+1);
            s.pop_back();
        }

    }

    vector<string> letterCombinations(string digits) {
        if (digits.empty()) // 处理空字符串情况
            return {};
        int index = 0;
        backtracking(digits,index);
        return result;

    }
};

错误以及注意事项

  • 看了一会儿没什么思路就看视频了。
  • 这里不使用startIndex的原因是,之前的是在一个集合中组合,避免元素重复所以设置了startIndex。而这道题是多个集合中各取一个,那就不需要设置startIndex,直接使用index表示选取集合中的第几个就是了。
  • leetcode中给的一个测试范例是空string,所以当digits.empty()的时候,直接return {} 空集合即可。
//方法2

学习时间:

2024.2.20 20:40-21:40 等待服务器恢复,又着急开题又着急工作又着急英语又想出国玩的我。

  • 14
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值