zoukankan      html  css  js  c++  java
  • LeetCode 40. Combination Sum II

    问题链接

    LeetCode 40. Combination Sum II

    题目解析

    给一组数和一个目标值,求和为目标值的组合。数组中的每个数最多只能取一次。

    解题思路

    本题与上一题LeetCode 39. Combination Sum十分相似,改变的条件是:数组中每个元素最多只能取一次

    在上一题中,我们是通过可以同一个起点(start)反复取同一个数得到结果,本题中为了避免重复,递归的时候起点+1,可以保证不取同一个数。

    这样做了之后还不够,本题中隐藏了一个改变,那就是原数组中有重复的数字,所有得到的结果中依然有重复的。如何解决了?两个办法,第一从源头上解决问题,在循环中,递归之前先判断一下:if (i > start && num[i] == num[i - 1]) continue; 仔细想一下,这样并不会使最终结果有所缺失,因为每次循环表示:尝试取当前数,进行递归,两个相同的数不需要尝试两次。第二种方法是总结过res使用set类型,最后传结果时在强制转换成vector。

    参考代码

    class Solution {
    public:
        vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
            set< vector<int> > res;
            vector<int> answer;
            sort(candidates.begin(), candidates.end());
            solve(candidates, target, res, answer, 0);
            vector < vector<int> > result(res.begin(), res.end());//强制转换
            return  result;
        }
        
        void solve(vector<int>& candidates, int target, set< vector<int> >& res, vector<int>& answer, int start) {
            if(target < 0) return;
            else if(target == 0) res.insert(answer);
            else {
                for(int i = start; i < candidates.size(); i++) {
                    answer.push_back(candidates[i]);
                    solve(candidates, target-candidates[i], res, answer, i+1);
                    answer.pop_back();
                }
            }
        }
    };
    

    相似题目

    LeetCode 39. Combination Sum


    LeetCode All in One题解汇总(持续更新中...)

    本文版权归作者AlvinZH和博客园所有,欢迎转载和商用,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.


  • 相关阅读:
    [Noip2017]逛公园
    [NOI2005]瑰丽华尔兹
    codeforces 558E A Simple Task
    bzoj1812 riv(树形背包)
    bzoj 1009 GT考试
    bzoj1030 文本生成器 Trie图+dp
    bzoj1500 维修数列(splay)
    [NOI2008]假面舞会
    测试用例的基本知识
    使用Xmind编写测试用例
  • 原文地址:https://www.cnblogs.com/AlvinZH/p/8947011.html
Copyright © 2011-2022 走看看