LEETCODE之Combination Sum系列
来源:互联网 发布:2017中国经济数据 编辑:程序博客网 时间:2024/05/29 14:32
Combination Sum
https://leetcode.com/problems/combination-sum/
题目中数值并不重复,而且允许使用多次,很简单的回溯算法,递归求解,注意先把数组排序一下,代码如下
class Solution {public: vector<vector<int> > combinationSum(vector<int>& candidates, int target) { vector<vector<int> > ivv; vector<int> tmp; sort(candidates.begin(),candidates.end()); combinationSum2(ivv,candidates,tmp,target,0); return ivv;}void combinationSum2(vector<vector<int> >& ivv,vector<int>& candidates, vector<int>& tmp,int target,int j) { if(target<0)return ; if(target==0){ivv.push_back(tmp);return ;} for(int i=j;i<candidates.size();++i){ if(candidates[i]<=target){ tmp.push_back(candidates[i]); combinationSum2(ivv,candidates,tmp,target-candidates[i],i); tmp.pop_back(); } }}};
Combination Sum2
https://leetcode.com/problems/combination-sum-ii/
题目中有数值的重复而只允许使用一次,因此需要排除重复数值,和上一题的思路一样,关键点在与排除重复的操作应该在递归之后,代码如下
class Solution {public: vector<vector<int> > combinationSum2(vector<int>& candidates,int target){vector<vector<int> > ret;vector<int> tmp;sort(candidates.begin(),candidates.end());helper(ret,tmp,candidates,target,0);return ret; } void helper(vector<vector<int> >&ret,vector<int>& tmp,vector<int>& nums,int k,int j){if(k<0) return ;if(k==0){ret.push_back(tmp);return;}for(int i=j;i<nums.size();++i){ if(nums[i]<=k){tmp.push_back(nums[i]);helper(ret,tmp,nums,k-nums[i],i+1);while(i<nums.size()&&nums[i]==nums[i+1]) { i++; }tmp.pop_back(); }} }};
Combination Sum3
https://leetcode.com/problems/combination-sum-iii/
题目给的数组为[1-9],区别于之前的题是增加了个数的限制,即k个不同的数构成n,求组合。思路一样,代码如下
class Solution {public: vector<vector<int>> combinationSum3(int k, int n) { vector<vector<int>> result; vector<int> path; backtrack(result, path, 1, k, n); return result;}void backtrack(vector<vector<int>> &result, vector<int> &path, int start, int k, int target){ if(target==0&&k==0){ result.push_back(path); return; } for(int i=start;i<=10-k&&i<=target;i++){ path.push_back(i); backtrack(result,path,i+1,k-1,target-i); path.pop_back(); }}//回溯,学习};
Combination Sum4
https://leetcode.com/problems/combination-sum-iv/
题目给的提示是动态规划,公式dp[i]=Σdp[i-nums[k]] 0<=k<=nums.size()
代码如下
class Solution {public: int combinationSum4(vector<int>& nums, int target) { vector<int> dp(target + 1); dp[0] = 1; sort(nums.begin(), nums.end()); for (int i = 1; i <= target; ++i) { for (auto a : nums) { if (i < a) break; dp[i] += dp[i - a]; } } return dp.back(); }};
1 0
- LEETCODE之Combination Sum系列
- LeetCode: Combination Sum系列
- 【LeetCode】 Combination Sum 系列
- leetcode之Combination Sum
- 【Leetcode】之Combination Sum
- leetcode之Combination Sum
- leetcode之Combination Sum && Combination Sum II
- leetcode系列(54)Combination Sum, Combination Sum II
- LeetCode之Combination Sum III
- 【Leetcode】之 Combination Sum II
- leetcode之Combination Sum II
- LeetCode 之 Combination Sum III
- Leetcode之combination-sum-ii
- leetcode之Combination Sum 问题
- [leetcode刷题系列]Combination Sum
- [leetcode刷题系列]Combination Sum II
- 【LeetCode从零单刷】Combinations & Combination Sum 系列
- [leetcode] 回溯法 Combination Sum 系列问题
- CTreeCtrl 控件使用总结
- 聊聊JVM:相对全面的GC总结(专栏)
- uip之protothreads
- php结合数据库演示商品多图片上传
- Weblogic10 与 Websphere MQ7集成方案[1]
- LEETCODE之Combination Sum系列
- Activity与Fragment通用的跳转工具类JumpUtil的实现
- 从输入URL到浏览器显示页面的详细过程
- Safari 3D变换会忽略z-index问题解决
- tomcat6.0与7.0 配置https协议
- FormatMessage函数的用法
- Android 事件输入系统分析计划
- Java thread中对异常的处理策略
- String的一部分替换为星号“*”