赞
踩
题目链接:https://leetcode.cn/problems/combination-sum-iii/
思路和77.组合类似,只不过多了一个和的判断
自写
- class Solution {
- public:
- vector<vector<int>>result;
- vector<int>path;
- int sum = 0;
- vector<vector<int>> combinationSum3(int k, int n) {
- result.clear();
- path.clear();
- sum = 0;
- backtracking(k,n,1);
- return result;
- }
-
- void backtracking(int k,int n,int startindex)
- {
- // 终止条件
- if(path.size()==k&&sum==n)
- {
- result.push_back(path);
- return ;
- }
- if(path.size()==k&&sum!=n)
- return ;
-
- // 单层搜索逻辑
- for(int i = startindex;i<=9;i++)
- {
- sum += i;
- path.push_back(i);
- backtracking(k,n,i+1);
- sum -= i;
- path.pop_back();
- }
- }
-
- };
优化
- class Solution {
- public:
- vector<vector<int>>result;
- vector<int>path;
- int sum = 0;
- vector<vector<int>> combinationSum3(int k, int n) {
- result.clear();
- path.clear();
- sum = 0;
- backtracking(k,n,1);
- return result;
- }
-
- void backtracking(int k,int n,int startindex)
- {
- // 终止条件
- if(path.size()==k)
- {
- if(sum==n)
- result.push_back(path);
- return ;
- }
-
- // 单层搜索逻辑
- for(int i = startindex;i<=9-(k-path.size())+1;i++) // 剪枝
- {
- sum += i;
- path.push_back(i);
- backtracking(k,n,i+1);
- sum -= i;
- path.pop_back();
- }
- }
-
- };
做完昨天的77题,再做这题,相对来说比较简单,套用模板即可。注意剪枝操作。
题目链接:https://leetcode.cn/problems/letter-combinations-of-a-phone-number/
先用一个二维string数组完成数字->字母的映射。因为本题是在多个集合中求组合,所以用index去控制digit里的下标,而不用startindex去控制for循环i的起始值,因为之前是在一个集合中求组合,所以要排除选过的元素。此处并不需要。digit的size代表了树的深度,数字映射到字母的数量代表了宽度。
- class Solution {
- public:
- // 数字->字母 映射表
- const string Lettermap[12] =
- {
- "", // 0
- "", // 1
- "abc", // 2
- "def", // 3
- "ghi", // 4
- "jkl", // 5
- "mno", // 6
- "pqrs", // 7
- "tuv", // 8
- "wxyz", // 9
- "", // *
- "", // #
- };
- string s; // 用于保存组合
- vector<string>result; // 用于保存结果
-
- vector<string> letterCombinations(string digits) {
- s.clear();
- result.clear();
-
- if(digits.size()==0)
- return result;
-
- backtracking(digits,0);
- return result;
- }
-
- void backtracking(const 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();
- }
- }
-
- };
没想清楚要怎么将数字映射成字母
今天继续练习回溯,继续加强回溯!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。