zoukankan      html  css  js  c++  java
  • 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.


    思路:深搜+动态规划

    本题的区别就在于每个数字智能用一次,我开始的想法是我去除重复数字,后来例子才让我明白这样不对,因为每个数字都可以的。

    还有就是,重复的力量非常可怕。去除重复的列子还记得吗?

    本题直接的一个变化就是start+1,但是在前面需要判断的就是我需要判断前面是否存在这个temp

    刚刚那个题目是数字可以多次利用,但不需判断是否存在,本身题目就没这个要求。已经试过。

    而第二题,每个数字只用过一次,很容易造成使用很多次的结果,导致存在相同组合。

    这个题目不需深究,本身leetcode有缺陷,如今,也算是见识到了。第一题,输入代码就是存在重复组合,而结果算是对的。



    代码:

    class Solution {
    public:
    //https://leetcode.com/problems/combination-sum-ii/
            vector<int>temp;
            vector<vector<int> >result;
            
        vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
            sort(candidates.begin(),candidates.end());
            
            sumHelper(candidates,target,0,candidates.size());
            return result;
        }
        
        void sumHelper(vector<int>& candidates,int target,int index,int length){
            //index代表数组索引值,length代表数组长度
            if(target==0){
                //这里很巧的是,别人用sum求和,他不用,他是相减,只要等于0了,就会存入数组中。
                if(find(result.begin(),result.end(),temp)==result.end()){   
                    result.push_back(temp);
                }
                return;//不需要返回
            }
            if(index>=length||target<0){//因为是求减法,如果不相等,立即返回||
                                       //还有一种是索引值大于数组长度
                return;
            }
            /*
            if (target < candidates[start]) {
                return;
            }  It seems it is also ok   
            */
            
            for(int i=index;i<=length-1;i++){
                temp.push_back(candidates[i]);
                sumHelper(candidates,target-candidates[i],i+1,length);
                temp.pop_back();
            }
        }
    };


  • 相关阅读:
    oracle入门
    转-nginx详解
    VNX磁盘状态分析
    Linux下确定哪个网卡对应哪个接口?
    企业运维人员最常用150个linux命令汇总
    linux系统LVM管理-逻辑卷扩容
    VNX1代-VNX2代
    VNX-SPS电池
    VNX存储系统,在磁盘做rebuilding的时候是否可以更换故障硬盘?
    Ubuntu系统挂载大于2T新硬盘方法
  • 原文地址:https://www.cnblogs.com/jsrgfjz/p/8519905.html
Copyright © 2011-2022 走看看