注册一亩三分地论坛,查看更多干货!
您需要 登录 才可以下载或查看附件。没有帐号?注册账号 
x
刷题刷到combination类,发现大多标准模板长这个样子,以combination sum 举例:
- void dfs(candidates, target, start, cur, ans){
- if (target==0) ans.push_back(cur); return;
- for (i=start ~ candidates.size()){
- if (target-candidates[i]<0) break;
- cur.push_back(candidates[i]);
- dfs (candidates, target - candidates[i], i, cur, ans);
- cur.pop_back(); }
- }
复制代码 而我发现有以下两道题目的写法并没有start以及for循环这个结构啊,不像典型的回溯模板:
LC22 Generate Parentheses
- void dfs(int left, int right, string& out, vector<string>& res){
- if(left>right) return;
- if(left==0 && right==0) res.push_back(out);
- if(left>0) dfs(left-1, right, out+'(', res);
- if(right>0) dfs(left, right-1, out+')', res);
- }
复制代码
以及LC494 Target Sum
- void dfs(vector<int>& nums, int d, int S, int& ans){
- if(d==nums.size()){
- if(S==0) ans++;
- return;
- }
- dfs(nums, d+1, S-nums[d], ans);
- dfs(nums, d+1, S+nums[d], ans);
- }
复制代码 我不知道应不应该把这几道题归纳在一起,但真的感觉它们很像,可是不知道为何后两道题的做法没有套用经典回溯的模板(i.e. for(i=start ...) do something; DFS(); undo something)
请大侠们指点下,什么情况用经典组合题模板,什么时候不要用? 多谢多谢
|