当前位置:   article > 正文

代码随想录 Day25 216.组合总和III 17.电话号码的字母组合

代码随想录 Day25 216.组合总和III 17.电话号码的字母组合

216.组合总和III

  1. class Solution {
  2. private:
  3. vector<vector<int>> result; // 存放结果集
  4. vector<int> path; // 符合条件的结果
  5. // targetSum:目标和,也就是题目中的n。
  6. // k:题目中要求k个数的集合。
  7. // sum:已经收集的元素的总和,也就是path里元素的总和。
  8. // startIndex:下一层for循环搜索的起始位置。
  9. void backtracking(int targetSum, int k, int sum, int startIndex) {
  10. if (path.size() == k) {
  11. if (sum == targetSum) result.push_back(path);
  12. return; // 如果path.size() == k 但sum != targetSum 直接返回
  13. }
  14. for (int i = startIndex; i <= 9; i++) {
  15. sum += i; // 处理
  16. path.push_back(i); // 处理
  17. backtracking(targetSum, k, sum, i + 1); // 注意i+1调整startIndex
  18. sum -= i; // 回溯
  19. path.pop_back(); // 回溯
  20. }
  21. }
  22. public:
  23. vector<vector<int>> combinationSum3(int k, int n) {
  24. result.clear(); // 可以不加
  25. path.clear(); // 可以不加
  26. backtracking(n, k, 0, 1);
  27. return result;
  28. }
  29. };
  1. class Solution {
  2. public:
  3. vector<int> path;
  4. vector<vector<int>> result;
  5. int sum = 0;
  6. void traversal(int k, int n, int startIndex){
  7. if(path.size() == k && sum == n){
  8. result.push_back(path);
  9. return ;
  10. }else if(path.size() >=k || sum >= n){
  11. return ;
  12. }
  13. for(int i = startIndex; i <= 9; i++){
  14. path.push_back(i);
  15. sum += i;
  16. traversal(k, n, i+1);
  17. path.pop_back();
  18. sum -= i;
  19. }
  20. }
  21. vector<vector<int>> combinationSum3(int k, int n) {
  22. traversal(k, n, 1);
  23. return result;
  24. }
  25. };

思路:本题的思路因为有昨天的内容的铺垫就简单很多,思路与昨天的代码思路是类似的。

问题:

1.注意像是自己写的代码中的情况如果要加判断语句进行剪枝的话尽量还是写在最前面的终止条件里面。

17.电话号码的字母组合

  1. class Solution {
  2. private:
  3. const string letterMap[10] = {
  4. "", // 0
  5. "", // 1
  6. "abc", // 2
  7. "def", // 3
  8. "ghi", // 4
  9. "jkl", // 5
  10. "mno", // 6
  11. "pqrs", // 7
  12. "tuv", // 8
  13. "wxyz", // 9
  14. };
  15. public:
  16. vector<string> result;
  17. string s;
  18. void backtracking(const string& digits, int index) {
  19. if (index == digits.size()) {
  20. result.push_back(s);
  21. return;
  22. }
  23. int digit = digits[index] - '0'; // 将index指向的数字转为int
  24. string letters = letterMap[digit]; // 取数字对应的字符集
  25. for (int i = 0; i < letters.size(); i++) {
  26. s.push_back(letters[i]); // 处理
  27. backtracking(digits, index + 1); // 递归,注意index+1,一下层要处理下一个数字了
  28. s.pop_back(); // 回溯
  29. }
  30. }
  31. vector<string> letterCombinations(string digits) {
  32. s.clear();
  33. result.clear();
  34. if (digits.size() == 0) {
  35. return result;
  36. }
  37. backtracking(digits, 0);
  38. return result;
  39. }
  40. };

思路:本题不同于之前的几道题目,需要进行二刷!!!

1. 本题不需要设置startIndex表明开始的位置因为不会出现不允许重复的问题,需要的是对于每个数字都返回相应的字母。所以在本题中是使用index作为确定是digit中第几个元素。

问题:有不少的细节点自己都没有注意到,也不懂得这样去做。

1. 如何一下子设置多个字符串,这个地方采用的是二位数组的方式,本身是一个数组而在数组中又存放了string字符串也就是另外的一个数组了。

  1. const string str[10]{//采用这种大括号的方式进行多个赋值
  2. "abc",
  3. "def",
  4. "ghi",//最后一个这个位置依然需要有逗号
  5. }

2. string类型依然可以看成是一个vector容器,所以说string类型可以通过push_back进行传入元素。

3. int digit = digits[index] - '0';这个地方需要使用的是单引号。

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

闽ICP备14008679号