153. 数字组合 II(DFS)

编程入门 行业动态 更新时间:2024-10-11 21:26:09

153. 数字<a href=https://www.elefans.com/category/jswz/34/1769978.html style=组合 II(DFS)"/>

153. 数字组合 II(DFS)

描述

给出一组候选数字(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]]

分析:
这道题跟之前那道 Combination Sum 组合之和 本质没有区别,只需要改动一点点即可,之前那道题给定数组中的数字可以重复使用,而这道题不能重复使用,只需要在之前的基础上修改两个地方即可,首先在递归的for循环里加上if (i > start && num[i] == num[i - 1]) continue; 这样可以防止res中出现重复项,然后就在递归调用combinationSum2DFS里面的参数换成i+1,这样就不会重复使用数组中的数字了,代码如下:

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 herevector<int>out;vector<vector<int> >res;sort(num.begin(),num.end());combationSum2DFS(num,target,0,out,res);return res;}void combationSum2DFS(vector<int>&num,int target,int start,vector<int>&out,vector<vector<int> >&res){if(target<0)return;else if(target==0) res.push_back(out);elsefor(int i=start;i<num.size();i++){if(i>start&&num[i]==num[i-1]) continue;out.push_back(num[i]);combationSum2DFS(num,target-num[i],i+1,out,res);out.pop_back();}}
};

 

更多推荐

153. 数字组合 II(DFS)

本文发布于:2024-02-07 10:20:48,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1756624.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:组合   数字   II   DFS

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!