leetcode第一刷_Combination Sum Combination Sum II
啊啊啊啊。好怀念这样的用递归保存路径然后打印出来的题目啊。好久没遇到了。
分了两种,一种是能够反复使用数组中数字的,一种是每一个数字仅仅能用一次的。事实上没有多大差别,第一种每次进入递归的时候都要从头開始尝试。另外一种要找一个标记的数组,把已经用到过的排除掉,就像生成全排列时的做法一样。
跟我一样用引用保存中间结果的话。要注意回退的情况。
另外一种回退时,要把用到的那个数也恢复为可用,就全然像全排列时做的一样。破例贴两个题的代码。由于他们是在是不值得用两片文章来写。
- class Solution {
- public:
- set<vector<int> > vis;
- bool used[1000];
- void getSum(vector<int> &num, vector<vector<int> > &res, vector<int> &tpres, int target){
- if(target == 0){
- vector<int> sortres = tpres;
- sort(sortres.begin(), sortres.end());
- if(vis.find(sortres) == vis.end()){
- vis.insert(sortres);
- res.push_back(sortres);
- }
- tpres.pop_back();
- return;
- }
- for(int i=0;i<num.size();i++){
- if(target<num[i]) continue;
- if(!used[i]){
- used[i] = 1;
- tpres.push_back(num[i]);
- getSum(num, res, tpres, target-num[i]);
- used[i] = 0;
- }
- }
- tpres.pop_back();
- }
- vector<vector<int> > combinationSum2(vector<int> &num, int target) {
- vector<vector<int> > res;
- if(num.size() <= 0) return res;
- vector<int> tpres;
- memset(used, 0, sizeof(used));
- getSum(num, res, tpres, target);
- return res;
- }
- };
- class Solution {
- public:
- set<vector<int> > vis;
- void getSum(vector<int> &candidates, vector<vector<int> > &res, vector<int> &tpres, int target){
- //cout<<target<<"*"<<endl;
- if(target<0){
- tpres.pop_back();
- return;
- }
- if(target == 0){
- vector<int> sortres = tpres;
- sort(sortres.begin(), sortres.end());
- if(vis.find(sortres) == vis.end()){
- res.push_back(sortres);
- //for(int i=0;i<tpres.size();i++)
- // cout<<tpres[i]<<" ";
- //cout<<endl;
- vis.insert(sortres);
- }
- tpres.pop_back();
- return;
- }
- for(int i=0;i<candidates.size();i++){
- if(target<candidates[i]) continue;
- tpres.push_back(candidates[i]);
- getSum(candidates, res, tpres, target-candidates[i]);
- //if(!tpres.empty()) tpres.pop_back();
- }
- if(!tpres.empty()) tpres.pop_back();
- }
- vector<vector<int> > combinationSum(vector<int> &candidates, int target) {
- vector<vector<int> > res;
- vector<int> tpres;
- if(candidates.size()<=0) return res;
- getSum(candidates, res, tpres, target);
- return res;
- }
- };
leetcode第一刷_Combination Sum Combination Sum II的更多相关文章
- [Leetcode 39]组合数的和Combination Sum
[题目] Given a set of candidate numbers (candidates) (without duplicates) and a target number (target) ...
- LeetCode解题报告—— Combination Sum & Combination Sum II & Multiply Strings
1. Combination Sum Given a set of candidate numbers (C) (without duplicates) and a target number (T) ...
- 【Leetcode】【Medium】Combination Sum II
Given a collection of candidate numbers (C) and a target number (T), find all unique combinations in ...
- Combination Sum,Combination Sum II,Combination Sum III
39. Combination Sum Given a set of candidate numbers (C) and a target number (T), find all unique co ...
- leetcode第一刷_Path Sum II
在更新上面一道题的时候我就想,是不是另一道打印路径的,果不其然啊. 这样的题非经常见的,做法也非常easy,我是用一个引用的vector来存,满足条件之后直接压入结果集中,当然也能够用数组之类的,都一 ...
- 【LeetCode每天一题】Combination Sum II(组合和II)
Given a collection of candidate numbers (candidates) and a target number (target), find all unique c ...
- leetcode第一刷_Minimum Path Sum
能够用递归简洁的写出,可是会超时. dp嘛.这个问题须要从后往前算,最右下角的小规模是已知的,边界也非常明显,是最后一行和最后一列,行走方向的限制决定了这些位置的走法是唯一的,能够先算出来.然后不断的 ...
- leetcode第一刷_Permutations II
当有反复元素的时候呢? 不用拍脑袋都会想到一种方法,也是全部有反复元素时的通用处理方法,维护一个set,假设这个元素没增加过就增加,增加过了的忽略掉.可是,在这道题上这个通用方法竟然超时了! 怎么办? ...
- leetcode第一刷_Populating Next Right Pointers in Each Node II
很自然的推广,假设去掉全然二叉树的条件呢?由于这个条件不是关键,因此不会影响整体的思路.做法依旧是每次找到一层的起点,然后一层一层的走. 假设是全然二叉树的话,每层的起点就是上一层起点的左孩子,兄弟之 ...
随机推荐
- 颜色分类(LintCode)
颜色分类 给定一个包含红,白,蓝且长度为n的数组,将数组元素进行分类使相同颜色的元素相邻,并按照红.白.蓝的顺序进行排序. 我们可以使用整数0,1和2分别代表红,白,蓝. 样例 注意 不能使用代码 ...
- 洛谷——P1916 小书童——蚂蚁大战
P1916 小书童——蚂蚁大战 题目背景 小A在你的帮助下,开始“刷题”,他在小书童里发现了一款叫“蚂蚁大战”(又称蛋糕保卫战)的游戏.(你懂得) 题目描述 游戏中会出现n只蚂蚁,分别有a1,a2…… ...
- android 项目 功能 源码 eclipse的
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha eclipse的
- [USACO 2017 Feb Gold] Tutorial
Link: 传送门 A: 分层图最短路(其实就是最短路转移时多记录一维的数据 #include <bits/stdc++.h> using namespace std; #define X ...
- [BZOJ3131] [Sdoi2013]淘金
[BZOJ3131] [Sdoi2013]淘金 Description 小Z在玩一个叫做<淘金者>的游戏.游戏的世界是一个二维坐标.X轴.Y轴坐标范围均为1..N.初始的时候,所有的整数坐 ...
- 【动态规划】Codeforces Round #406 (Div. 2) C.Berzerk
有向图博弈问题. 能转移到一个必败态的就是必胜态. 能转移到的全是必胜态的就是必败态. 转移的时候可以用队列维护. 可以看这个 http://www.cnblogs.com/quintessence/ ...
- 1.4(SQL学习笔记)分组、子查询、联结、组合查询
一.分组 建表及数据填充语句下载:链接: https://pan.baidu.com/s/1WHYafwqKJEKq1kDwCH_Zlg 提取码: 3wy4 1.1初识分组 分组是按照某一列,将该列中 ...
- Problem F: 零起点学算法42——多组测试数据输出II
#include<stdio.h> int main() { ; while(scanf("%d%d%d",&a,&b,&c)!=EOF) { ...
- Codeforces Round #343 (Div. 2) E. Famil Door and Roads lca 树形dp
E. Famil Door and Roads 题目连接: http://www.codeforces.com/contest/629/problem/E Description Famil Door ...
- Inno Setup入门(二十一)——Inno Setup类参考(7)
复选框 复选框(CheckBox)用于多个并不互斥的几个选项中作出一个或者多选择,例如字体可以有粗体.斜体和下划线,这三种状态可以任意组合,像这样的选项可以采用复选框实现.Pascal脚本中对应的类是 ...