当前位置:   article > 正文

代码随想录算法训练营第二十五天|216.组合总和III、17.电话号码的字母组合

代码随想录算法训练营第二十五天|216.组合总和III、17.电话号码的字母组合

LeetCode 216 组合总和III

题目链接:https://leetcode.cn/problems/combination-sum-iii/

思路:

思路和77.组合类似,只不过多了一个和的判断

代码:

  • 自写

  1. class Solution {
  2. public:
  3. vector<vector<int>>result;
  4. vector<int>path;
  5. int sum = 0;
  6. vector<vector<int>> combinationSum3(int k, int n) {
  7. result.clear();
  8. path.clear();
  9. sum = 0;
  10. backtracking(k,n,1);
  11. return result;
  12. }
  13. void backtracking(int k,int n,int startindex)
  14. {
  15. // 终止条件
  16. if(path.size()==k&&sum==n)
  17. {
  18. result.push_back(path);
  19. return ;
  20. }
  21. if(path.size()==k&&sum!=n)
  22. return ;
  23. // 单层搜索逻辑
  24. for(int i = startindex;i<=9;i++)
  25. {
  26. sum += i;
  27. path.push_back(i);
  28. backtracking(k,n,i+1);
  29. sum -= i;
  30. path.pop_back();
  31. }
  32. }
  33. };
  • 优化

  1. class Solution {
  2. public:
  3. vector<vector<int>>result;
  4. vector<int>path;
  5. int sum = 0;
  6. vector<vector<int>> combinationSum3(int k, int n) {
  7. result.clear();
  8. path.clear();
  9. sum = 0;
  10. backtracking(k,n,1);
  11. return result;
  12. }
  13. void backtracking(int k,int n,int startindex)
  14. {
  15. // 终止条件
  16. if(path.size()==k)
  17. {
  18. if(sum==n)
  19. result.push_back(path);
  20. return ;
  21. }
  22. // 单层搜索逻辑
  23. for(int i = startindex;i<=9-(k-path.size())+1;i++)    // 剪枝
  24. {
  25. sum += i;
  26. path.push_back(i);
  27. backtracking(k,n,i+1);
  28. sum -= i;
  29. path.pop_back();
  30. }
  31. }
  32. };

总结

做完昨天的77题,再做这题,相对来说比较简单,套用模板即可。注意剪枝操作。

LeetCode 17 电话号码的字母组合

题目链接:https://leetcode.cn/problems/letter-combinations-of-a-phone-number/

思路:

先用一个二维string数组完成数字->字母的映射。因为本题是在多个集合中求组合,所以用index去控制digit里的下标,而不用startindex去控制for循环i的起始值,因为之前是在一个集合中求组合,所以要排除选过的元素。此处并不需要。digit的size代表了树的深度,数字映射到字母的数量代表了宽度。

代码:

  1. class Solution {
  2. public:
  3.     // 数字->字母 映射表
  4. const string Lettermap[12] =
  5. {
  6. "", // 0
  7. "", // 1
  8. "abc", // 2
  9. "def", // 3
  10. "ghi", // 4
  11. "jkl", // 5
  12. "mno", // 6
  13. "pqrs", // 7
  14. "tuv", // 8
  15. "wxyz", // 9
  16. "", // *
  17. "", // #
  18. };
  19. string s; // 用于保存组合
  20. vector<string>result; // 用于保存结果
  21. vector<string> letterCombinations(string digits) {
  22. s.clear();
  23. result.clear();
  24. if(digits.size()==0)
  25. return result;
  26. backtracking(digits,0);
  27. return result;
  28. }
  29. void backtracking(const string& digits,int index)
  30. {
  31. // 终止条件
  32. if(index==digits.size())
  33. {
  34. result.push_back(s);
  35. return ;
  36. }
  37. // 将数字映射成字母
  38. int digit = digits[index] - '0';
  39. string letter = Lettermap[digit];
  40. for(int i = 0;i<letter.size();i++)
  41. {
  42. s.push_back(letter[i]);
  43. backtracking(digits,index+1);
  44. s.pop_back();
  45. }
  46. }
  47. };

总结

没想清楚要怎么将数字映射成字母

今日总结:

今天继续练习回溯,继续加强回溯!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/299653
推荐阅读
相关标签
  

闽ICP备14008679号