博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LeetCode OJ:Combination Sum II (组合之和 II)
阅读量:5869 次
发布时间:2019-06-19

本文共 2918 字,大约阅读时间需要 9 分钟。

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, a1 ≤ a2 ≤ … ≤ 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] 

 

题目实际和组合之和(见其他博文)很像,但是这里组合中的数是可以有重复的,但是每个数最多只能用一次,所以说实现上与前面那个有点不相似的地方,代码见下,注释写的还是比较清楚的:

1 class Solution { 2 public: 3     vector
> combinationSum2(vector
& candidates, int target) { 4 tmpCdd = candidates; 5 sort(tmpCdd.begin(), tmpCdd.end()); 6 vector
tmpVec; 7 dfs(tmpVec, 0, target);//这个dfs的参数分别是当前vec中含有的元素数目 8 return result; //序号起始以及,距离target还差的数目 9 }10 private:11 vector
tmpCdd;12 vector
> result;13 void dfs(vector
& tmpVec, int index, int tgt)14 {15 if(tgt == 0){16 result.push_back(tmpVec);17 return; //达到target,剪枝18 }19 if(index == tmpCdd.size()) return;20 else{21 for(int idx = index; idx < tmpCdd.size(); ++idx){22 if (idx != index && tmpCdd[idx] == tmpCdd[idx - 1])23 continue; //这一步的主要目标是防止相邻相同的数和其他数一起匹配成为多个相同的vector,很关键。24 if(tmpCdd[idx] <= tgt){25 tmpVec.push_back(tmpCdd[idx]); //这其他的实际上和combinationSum1是相同的26 dfs(tmpVec, idx + 1, tgt - tmpCdd[idx]);27 tmpVec.pop_back();28 }29 }30 }31 }32 };

大体就是这样,感觉写的有点乱,想想以后可能再来改。

java版本如下所示,相比上面的写的条理相对的要清楚一点,代码如下所示:

1 public class Solution { 2     public List
> combinationSum2(int[] candidates, int target) { 3 List
> ret = new ArrayList
>(); 4 Arrays.sort(candidates); 5 for(int i = 0; i < candidates.length; ++i){ 6 List
curr = new ArrayList
(); 7 if(i != 0 && candidates[i] == candidates[i-1]) //注意这里和下面同样的地方,防止出现相同的组合 8 continue; 9 curr.add(candidates[i]);10 getCombination(ret, i + 1, target - candidates[i], curr, candidates);11 curr.remove(curr.size() - 1);12 }13 return ret;14 }15 public void getCombination(List
> ret, int index, int target, List
tmpCdd, int [] candidates){16 if(index > candidates.length)17 return;18 if(target < 0){19 return;20 }else if(target == 0){21 ret.add(new ArrayList
(tmpCdd));22 return;23 }else{24 for(int i = index; i < candidates.length; ++i){25 if(i != index && candidates[i] == candidates[i-1])26 continue;27 tmpCdd.add(candidates[i]);28 getCombination(ret, i + 1, target - candidates[i], tmpCdd, candidates);29 tmpCdd.remove(tmpCdd.size() - 1);30 }31 }32 }33 }

 

转载于:https://www.cnblogs.com/-wang-cheng/p/4866762.html

你可能感兴趣的文章
FreeCMS视频教程 栏目信息访问权限设置
查看>>
Android硬件抽象层(HAL)深入剖析(二)
查看>>
I2C总线传输协议
查看>>
Git的原理简介和常用命令
查看>>
各种距离(Distance)
查看>>
性格影响命运
查看>>
Mysql Explain分析
查看>>
如何解决基本的 TCP/IP 问题
查看>>
nginx 学习笔记(6) nginx配置文件中的度量单位
查看>>
redis配置
查看>>
GC优化
查看>>
TiDB 源码阅读系列文章(二)初识 TiDB 源码
查看>>
Java集合(十二)Map概括,总结
查看>>
123
查看>>
字符串学习笔记
查看>>
32位和64位的操作系统的差异
查看>>
SVN 分支建立 和 合并
查看>>
Java 中的 Integer 和 int 学习笔记
查看>>
OpenWRT开发之——目录分析与make过程
查看>>
连接收藏
查看>>