zoukankan      html  css  js  c++  java
  • 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;
        }
    };
    
  • 相关阅读:
    Java中List集合去除重复数据的六种方法
    常见的Redis面试"刁难"问题,值得一读
    以Integer类型传参值不变来理解Java值传参
    Linux系统安装snmp服务
    直接取数据到RANGE
    SAP翔子_2019集结号
    销售订单BOM组件分配(CP_BD_DIRECT_INPUT_PLAN_EXT)
    SAP翔子_webservice篇索引
    函数篇3 EXCEL导入函数去除行数限制
    ABAP基础篇4 常用的字符串操作语法
  • 原文地址:https://www.cnblogs.com/libaoquan/p/7259983.html
Copyright © 2011-2022 走看看