dfs的入参是这样:总结果,当前结果,当前总和,数组,数组下标,target
如果当前结果>target直接退出
如果==target,记录结果
总和小于target说明当前需要加数字进去了,但是可以加的数字从pos位置开始往后都可以加入到数组中。这边因为可能有重复,那么如果当前数字和前面数字重复了就直接continue跳过。

https://leetcode.com/problems/combination-sum-ii/description/
题意
给一个数组和一个目标数,其中数组有重复的,找组合为target的所有结果
分析
回溯法。先将数组进行排序,遍历的时候如果重复了就直接跨过去。
因为不能够重复使用数字,所以回溯的时候要跨过去。
代码
class Solution {
List<List<Integer>> result = new LinkedList<List<Integer>>();
int target ;
public List<List<Integer>> combinationSum2(int[] candidates, int target) {
if(candidates == null || candidates.length <= 0 || target < 0) return result;
this.target = target;
Arrays.sort(candidates);
backTrack(candidates,0,new LinkedList<Integer>(),0);
return result;
}
//回溯法,回溯过程中:
//1.不满足条件的直接return,这边curSum超出target
//2.满足的直接记录到全局变量中
//3.否则继续回溯,回溯记录路径的时候记得加入和弹出
public void backTrack(int[] nums,int curSum,List<Integer> temp,int start) {
if (curSum > target) return;
if (curSum == target) {
result.add(new LinkedList(temp));
return;
}
for (int i = start; i < nums.length; i++) {
if (i > start && nums[i] == nums[i - 1])continue;
temp.add(nums[i]);
backTrack(nums,curSum + nums[i],temp,i + 1);
temp.remove(temp.size() - 1);
}
}
}

转载于:https://www.cnblogs.com/buptyuhanwen/p/8985625.html

leecode---40---数组,dfs---求所有的组合为target,有重复数组相关推荐

  1. pinyin4j把中文句子(含有多音字字母)转成拼音(二维数组递归求所有组合情况返回list)算法实现!...

    介绍 Pinyin4j是一个流行的Java库,支持中文字符和拼音之间的转换.拼音输出格式可以定制,然而真正的把含有多音字.数字.字母的中文句子转成拼音得到所有的组合情况却有很大难度,我看过很多有关博客 ...

  2. pinyin4j把中文句子(含有多音字字母)转成拼音(二维数组递归求所有组合情况返回list)算法实现!

    介绍 Pinyin4j是一个流行的Java库,支持中文字符和拼音之间的转换.拼音输出格式可以定制,然而真正的把含有多音字.数字.字母的中文句子转成拼音得到所有的组合情况却有很大难度,我看过很多有关博客 ...

  3. DFS算法模板-排列组合-python

    DFS算法模板: def dfs(array or root, cur_layer, path, result):if cur_layer == len(array) or not root:resu ...

  4. HDU 4607 Park Visit 两次DFS求树直径

    两次DFS求树直径方法见 这里. 这里的直径是指最长链包含的节点个数,而上一题是指最长链的路径权值之和,注意区分. K <= R: ans = K − 1; K > R:   ans = ...

  5. 用Java语言定义一个整数定义的数组,求奇数个数和偶数个数。

    ##[Java] 定义一个整数定义的数组,求奇数个数和偶数个数. /*作者:龙蝶 *日期:2020年4月4日 */public clsss Array{public static void main( ...

  6. python输入一个英文句子、求其中最长的单词的changd_数组练习

    (1)3有以下程序 main() { int p[8]={11,12,13,14,15,16,17,18},i=0,j=0; while(i++<7) if(p[i]%2) j+=p[i]; p ...

  7. c语言程序设计5*5矩阵求出,实用C语言程序设计教程5数组和矩阵ppt221.ppt

    实用C语言程序设计教程5数组和矩阵ppt221 C语言程序设计 - 第5章 数组和矩阵 第5章 构造数据-- 数组和矩阵 本章教学目标 1.理解C语言中数组的本质及其在内存的存储结构 2.应用数组表示 ...

  8. C语言编程>第七周 ⑧ 请编一个函数void fun(int a[M][N],int b[N]),c指向一个M行N列的二维数组,求出二维数组每列中最大元素,并依次放入b所指一维数组中。

    例题:请编一个函数void fun(int a[M][N],int b[N]),c指向一个M行N列的二维数组,求出二维数组每列中最大元素,并依次放入b所指一维数组中.二维数组中的数己在主函数中赋予. ...

  9. 拓扑排序【Kahn算法(bfs)和dfs求拓扑序列及判环】

    拓扑排序 对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,该排序满足这样的条件--对于图中的任意两个结点u和v,若存在一条有 ...

  10. 树状数组(求子区间和+更新元素值)

    树状数组 欲完成修改值和查询区间和两种操作 求前缀和的做法时间复杂度为O(n)O(n)O(n) 使用树状数组时间复杂度降为O(logn)O(logn)O(logn) lowbit 1.x&(- ...

最新文章

  1. 黄聪:《跟黄聪学WordPress插件开发》
  2. 为什么基类的析构函数要声明成虚函数
  3. PAT Basic 1069. 微博转发抽奖(20)
  4. spring mvc返回json
  5. 3 当某个应用的CPU使用达到100%,该怎么办?
  6. xaml中的布局面板
  7. java的平方分之x的平方加xy_Java面试宝典_基础编程练习题_完全平方数
  8. Java面试之什么是GCRoots,能做什么?
  9. php +html5 websocket 聊天室
  10. cocos2d(CCSprite 用贝塞尔做抛物线,足球精灵并且同时做旋转放大效果)
  11. 图像块的访问(填充 padding,步长 stride,窗 Window/kernel/filter)
  12. 面向项目(九)—— 交叉工具链
  13. core dump 简介
  14. games101-789-shading
  15. 基于GD32F10x手动编程实现简易freertos实时操作系统
  16. w10计算机恢复出厂设置,win10强制恢复出厂设置教程
  17. 小心身份证复印件的使用
  18. 【无标题】线性代数的可用之地----图像的矩阵表示之浅看
  19. 维修服务器的请示,关于更换云服务器的请示
  20. 校验码 汉明码 CRC码

热门文章

  1. Atitit spring5 集成 mybatis 注解班
  2. Atitit redis使用 attilax 艾提拉总结 1.1. Redis默认有16个库,默认连接的是 index=0 的那一个。解决与原来不方便查询查看的问题 1 1.2. redis不是现
  3. Atitit.注重细节还是关注长远??长远优先
  4. Atitit.c# .net 3.5 4.0 4.5 5.0 6.0各个版本新特性战略规划总结
  5. Atitit.ALT+TAB没反应车and 点击任务栏程序闪烁但是不能切换
  6. paip.提升用户体验--radio图片选择器 easyui 实现..
  7. paip.mysql备份慢的解决
  8. paip.XXListener is already configured监听器已经被配置的解决
  9. 趋势 | 或许,这就是大佬吧!——美国ETF产业三巨头格局浅谈
  10. 着力财富管理市场产品全覆盖 基金公司争设销售子公司