lintcode-153-数字组合 II
153-数字组合 II
给出一组候选数字(C)和目标数字(T),找出C中所有的组合,使组合中数字的和为T。C中每个数字在每个组合中只能使用一次。
注意事项
所有的数字(包括目标数字)均为正整数。
元素组合(a1, a2, … , ak)必须是非降序(ie, a1 ≤ a2 ≤ … ≤ ak)。
解集不能包含重复的组合。样例
给出一个例子,候选数字集合为[10,1,6,7,2,1,5] 和目标数字 8 ,
解集为:[[1,7],[1,2,5],[2,6],[1,1,6]]标签
回溯法 数组 深度优先搜索
思路
使用回溯加递归的方式,需要先对原数组排序,另外需要注意筛除重复的结果集
code
class Solution {
public:
	/**
	 * @param num: Given the candidate numbers
	 * @param target: Given the target number
	 * @return: All the combinations that sum to target
	 */
    vector<vector<int> > combinationSum2(vector<int> &num, int target) {
        // write your code here
        int size = num.size();
        if (size <= 0) {
            return vector<vector<int> >();
        }
        sort(num.begin(), num.end());
        vector<vector<int> > result;
        vector<int> temp;
        isInsert(result, temp, num, 0, 0, target);
        return result;
    }
    void isInsert(vector<vector<int> > &result, vector<int> &temp, vector<int> &num, int current, int sum, int target) {
        if (sum == target && !isExisted(result, temp)) {
            result.push_back(temp);
            return;
        }
        if (current < num.size() && sum < target) {
            sum += num[current];
            temp.push_back(num[current]);
            isInsert(result, temp, num, current + 1, sum, target);
            sum -= temp[temp.size() - 1];
            temp.pop_back();
            isInsert(result, temp, num, current + 1, sum, target);
        }
    }
    bool isExisted(vector<vector<int> > &result, vector<int> &temp) {
        for (int i = 0; i < result.size(); i++) {
            if (temp.size() == result[i].size()) {
                int ret = true;
                for (int j = 0; j < temp.size(); j++) {
                    if (temp[j] == result[i][j]) {
                        ret = ret & true;
                    }
                    else {
                        ret = ret & false;
                    }
                }
                if (ret == true) {
                    return true;
                }
            }
        }
        return false;
    }
};
												
											lintcode-153-数字组合 II的更多相关文章
- lintcode:数字组合 II
		
数字组合 II 给出一组候选数字(C)和目标数字(T),找出C中所有的组合,使组合中数字的和为T.C中每个数字在每个组合中只能使用一次. 注意事项 所有的数字(包括目标数字)均为正整数. 元素组合(a ...
 - lintcode:数字组合III
		
数字组合III 组给出两个整数n和k,返回从1......n中选出的k个数的组合. 您在真实的面试中是否遇到过这个题? Yes 样例 例如 n = 4 且 k = 2 返回的解为: [[2,4],[3 ...
 - lintcode:数字组合I
		
数字组合I 给出一组候选数字(C)和目标数字(T),找到C中所有的组合,使找出的数字和为T.C中的数字可以无限制重复被选取. 例如,给出候选数组[2,3,6,7]和目标数字7,所求的解为: [7], ...
 - JAVAWEB项目实现验证码中文、英文、数字组合
		
验证码基础 一.什么是验证码及它的作用 :验证码为全自动区分计算机和人类的图灵测试的缩写,是一种区分用户是计算机的公共全自动程序,这个问题可以由计算机生成并评判,但是必须只有人类才能解答.可以防止恶意 ...
 - tyvj1096 数字组合
		
描述 在N个数中找出其和为M的若干个数.先读入正整数N(1<N<100)和M(1<M<10000), 再读入N个正数(可以有相同的数字,每个数字均在1000以内), 在这N个数 ...
 - OpenJudge 2985数字组合 解析报告/DP
		
2985:数字组合 总时间限制: 1000ms 内存限制: 65536kB 描述 有n个正整数,找出其中和为t(t也是正整数)的可能的组合方式.如:n=5,5个数分别为1,2,3,4,5,t=5: ...
 - XDU 1161 - 科协的数字游戏II
		
Problem 1161 - 科协的数字游戏II Time Limit: 1000MS Memory Limit: 65536KB Difficulty: Total Submit: 112 ...
 - noi 2985 数字组合
		
题目链接: http://noi.openjudge.cn/ch0206/2985/ 2985:数字组合 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 有n个正 ...
 - JS生成随机的由字母数字组合的字符串
		
前言 最近有个需求,是需要生成3-32位长度的字母数字组合的随机字符串,另一个是生成43位随机字符串. 方法一 奇妙的写法 1 Math.random().toString(36).substr( ...
 
随机推荐
- python教程(三)·函数与模块
			
函数,这和数学中的函数有点关联,但又不是完全等价 概念 不说的这么官方,我就已自己的理解来表达 ^_^ 在数学中,把一个或多个值(输入x)进行一定的计算或者映射,得到一个值(输出y),这个计算或者映射 ...
 - ISAP学习笔记
			
学完了ISAP,感觉心情舒畅,毕竟ISAP比Dinic好一点. 说到底ISAP其实是Dinic(不熟悉Dinic的人去我的博客找猴子课堂----最大流与最小割(看看思想),已经置顶)优化版,熟悉的人知 ...
 - Go语言入门(一)特性、安装、环境搭建、第一个程序等
			
Go语言是谷歌推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性.谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发Go,是因为过去10多年间软件开发的难度令人沮 ...
 - Java设计模式(9)——结构型模式之装饰模式(Decorator)
			
一.概述 动态地给一个对象添加一些额外的职责.就增加功能来说, Decorator模式相比生成子类更为灵活.该模式以对客 户端透明的方式扩展对象的功能. UML简图 角色 在持有Component的引 ...
 - 优步UBER司机全国各地奖励政策汇总 (2月29日-3月6日)
			
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
 - 海思NB-IOT死机问题解决记录
			
1. 首先抓下LOG的信息,这个应该是MCU到NB的数据 2. 看下NB到MCU的数据 3. 总结起来,只看到了NB模块的启动,似乎AT指令,肯本没收到.测试中确实出现了复位,但是不清楚是发送的AT指 ...
 - oradebug 的学习    一
			
说明 oradebug主要是给oracle支持人员使用的,尽管很早便有,但oracle官网很少有记载.他是个sql*plus命令行工具,有sysdba的权限就可以登入,无需特别设置.他可以被用 ...
 - 「专题训练」k-Tree(CodeForces Round #247 Div.2 C)
			
题意与分析(Codeforces-431C) 题意是这样的:给出K-Tree--一个无限增长的树,它的每个结点都恰有\(K\)个孩子,每个节点到它\(K\)个孩子的\(K\)条边的权重各为\(1,2, ...
 - uvaoj 101 - The Blocks Problem(vector应用+技巧)
			
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=835&page= ...
 - Qt-QML-Loader初步接触
			
先说说为什么用到了QML的Loader,这里我就要先扯点别的,那就是QML自带的ColorDialog,QML的机制 是优先调用系统提供的ColorDialog,如果系统的ColorDialog的不可 ...