zoukankan      html  css  js  c++  java
  • [LeetCode] Combination Sum II

    Given a collection of candidate numbers (C) and a target number (T), find all unique combinations in C where the candidate numbers sums to T.

    Each number in C may only be used once in the combination.

    Note:

    • All numbers (including target) will be positive integers.
    • Elements in a combination (a1, a2, … , ak) must be in non-descending order. (ie, a1a2 ≤ … ≤ ak).
    • The solution set must not contain duplicate combinations.

    For example, given candidate set 10,1,2,7,6,1,5 and target 8,
    A solution set is:
    [1, 7]
    [1, 2, 5]
    [2, 6]
    [1, 1, 6]

    以下是我 AC 的代码:

    /**
     * author: Zhou J
     */
    class Solution 
    {
    public:
        vector<vector<int> > combinationSum2(vector<int> &num, int target) 
        {
            sort(num.begin(), num.end());
            vector<vector<int>> ret;
            vector<int> path;
            combinationSum2Rec(num, target, ret, path, 0);
            return ret;
        }
        
    private:
        void combinationSum2Rec(const vector<int> &num,
                                const int target,
                                vector<vector<int>> &ret,
                                vector<int> &path,
                                size_t pos)
        {
            if (target == 0)
            {
                ret.push_back(path);
                return;
            }
            
            // Mark the previous one
            int prev = -1;
            
            for (size_t ix = pos; ix != num.size(); ++ix)
            {
                if (num[ix] > target)
                {
                    break;
                }
                
                if (prev == num[ix])
                {
                    continue;
                }
                
                path.push_back(num[ix]);
                combinationSum2Rec(num, target - num[ix], ret, path, ix + 1);
                // Backtracing. Note that we should sort the vector before we use the skill of backtracing.
                path.erase(path.end() - 1);
                // The one which we have pushed just now. 
                prev = num[ix];
            }
        }
    };
  • 相关阅读:
    前端验证银行卡(Luhn校验算法)
    常见的三狼布局
    项目中的分页插件
    JavaScript葵花宝典之闭包
    CSS 高级布局技巧
    window.open打开新窗口被浏览器拦截的处理方法
    Input输入框输入银行卡号自动空格
    关于NSURLSession的上传和下载
    将一个字符串从第40个字节开始替换为@"..."
    IOS开发之高级功能---远程推送
  • 原文地址:https://www.cnblogs.com/jianxinzhou/p/4190376.html
Copyright © 2011-2022 走看看