Leetcode216-组合总和三

  • 找出所有相加之和为 n 的 k 个数的组合,且满足下列条件:
  • 只使用数字1到9
  • 每个数字 最多使用一次
  • 返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回
  • 输入: k = 3, n = 7
  • 输出: [[1,2,4]]
  ArrayList<List<Integer>> res=new ArrayList<>();
LinkedList<Integer> integers=new LinkedList<>();
int sum=0;
public List<List<Integer>> combinationSum3(int k, int n) {
combine(k,n,1);
return res;
} public void combine(int k,int n,int startIndex) {
if (sum != n && integers.size() == k) {
return;
}
if (sum == n && integers.size() == k) {
res.add(new LinkedList<Integer>(integers));
}
for (int i = startIndex; i <= 9; i++) {
sum += i;
integers.addFirst(i);
//使用addFirst和removeFirst每个integers里面是倒序的
//要正序使用add和removeLast就行了
combine(k, n, i + 1);
integers.removeFirst();
sum -= i;
}
}

Leetcode39-组合总和

  • 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。
  • candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。
  • 输入:candidates = [2,3,6,7], target = 7
  • 输出:[[2,2,3],[7]]
    ArrayList<List<Integer>> res = new ArrayList<>();
LinkedList<Integer> integers = new LinkedList<>();
int sum = 0; public List<List<Integer>> combinationSum(int[] candidates, int target) {
combine(candidates, target, 0);
return res;
} public void combine(int[] candidates, int target, int startIndex) {
if (sum > target) {
return;
}
if (sum == target) {
res.add(new LinkedList<>(integers));
return;
}
for (int i = startIndex; i < candidates.length; i++) {
sum += candidates[i];
integers.add(candidates[i]);
combine(candidates, target, i);
integers.removeLast();
sum -= candidates[i];
}
}

Leetcode40-组合总和二

  • 给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
  • candidates 中的每个数字在每个组合中只能使用 一次
  • 注意:解集不能包含重复的组合。
  • 输入: candidates = [10,1,2,7,6,1,5], target = 8,
  • 输出:
    [
    [1,1,6],
    [1,2,5],
    [1,7],
    [2,6]
    ]
  ArrayList<List<Integer>> res = new ArrayList<>();
LinkedList<Integer> integers = new LinkedList<>();
int sum = 0; public List<List<Integer>> combinationSum2(int[] candidates, int target) {
Arrays.sort(candidates);
//加标志数组,用来辅助判断同层节点是否已经遍历
boolean[] flag = new boolean[candidates.length];
combine(candidates, target, 0, flag);
return res;
} public void combine(int[] candidates, int target, int startIndex, boolean[] flag) {
if (sum > target) {
return;
}
if (sum == target) {
res.add(new LinkedList<>(integers));
return;
}
for (int i = startIndex; i < candidates.length; i++) {
//出现重复节点直接跳过
if (i > 0 && candidates[i] == candidates[i - 1] && flag[i - 1] == false) {
continue;
}
flag[i] = true;
sum += candidates[i];
integers.add(candidates[i]);
combine(candidates, target, i + 1, flag);
integers.removeLast();
sum -= candidates[i];
flag[i] = false;
}
}

L77-组合

  • 给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。
  • 你可以按 任何顺序 返回答案
  • 输入:n = 4, k = 2
  • 输出:
    [
    [2,4],
    [3,4],
    [2,3],
    [1,2],
    [1,3],
    [1,4],
    ]
    List<List<Integer>> result = new ArrayList<>();
LinkedList<Integer> path = new LinkedList<>();
public List<List<Integer>> combine(int n, int k) {
combineRes(n,k,1);
return result;
} public void combineRes(int n,int k,int startIndex){
//终止条件
if(path.size()==k){
result.add(new ArrayList<>(path));//防止递归操作影响以及保存好的path
return;
}
//剪枝优化 此处仔细想想
//如果for循环选择的起始位置之后的元素个数 已经不足 我们需要的元素个数了,那么就没有必要搜索了。
//已经选择的元素个数:path.size();
//还需要的元素个数为: k - path.size();
//在集合n中至多要从该起始位置 : n - (k - path.size()) + 1,开始遍历
//不剪枝直接 for(int i=startIndex;i<=n;i++)
for(int i=startIndex;i<=n-(k-path.size())+1;i++){
path.addFirst(i);
combineRes(n,k,i+1);
path.removeFirst();
}
}

Leetcode216/39/40/77之回溯解决经典组合问题的更多相关文章

  1. python实例:解决经典扑克牌游戏 -- 四张牌凑24点 (二)

    Hey! 如果你还没有看这篇的上文的话,可以去稍稍瞅一眼,会帮助加速理解这一篇里面涉及到的递归结构哦!(上一篇点这里:<python实例:解决经典扑克牌游戏 -- 四张牌凑24点 (一)> ...

  2. 三十五、lamp经典组合搭建

    一.安装mysql数据库 1.1  创建组和用户: 1)groupadd mysql 2)useradd mysql   -g mysql -M  -s  /sbin/nologin 3)config ...

  3. python实例:解决经典扑克牌游戏 -- 四张牌凑24点 (一)

    Hey! Hope you had a great day so far! 今天想和大家讨论的是一道我从这学期cs的期末考试得到灵感的题:Get 24 Poker Game.说到 Get 24 Pok ...

  4. 39. Combination Sum(medium, backtrack 的经典应用, 重要)

    Given a set of candidate numbers (C) (without duplicates) and a target number (T), find all unique c ...

  5. <BackTracking> dfs: 39 40

    39. Combination Sum Combination,组合问题用DFS罗列全部的答案. class Solution { public List<List<Integer> ...

  6. leetcode四道组合总和问题总结(39+40+216+377)

    39题目: 链接:https://leetcode-cn.com/problems/combination-sum/ 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 ...

  7. Leetcode 39 40 216 Combination Sum I II III

    Combination Sum Given a set of candidate numbers (C) and a target number (T), find all unique combin ...

  8. 77. Combinations(回溯)

    Given two integers n and k, return all possible combinations of k numbers out of 1 ... n. Example: I ...

  9. c++回溯法求组合问题(取数,选取问题)从n个元素中选出m个的回溯算法

    假如现在有n个数,分别从里面选择m个出来,那么一共有多少种不同的组合呢,分别是哪些呢? 利用计算机的计算力,采用回溯算法很容易求解 程序源代码如下: #include<iostream># ...

随机推荐

  1. 网站SQL注入防御实战

    SQL注入作为直接威胁web业务的最严重攻击行为,已经被大多数的网站管理员所了解,这种通过HTTP标准端口,利用网页编码不严谨,提交精心构造的代码实现对数据库非授权访问的攻击方法,已经被越来越多的sc ...

  2. 磁盘管理--如何在VMware上给centos7增加一块磁盘

    一. 实验环境 VMware Workstaion + Centos7 二.实验步骤 1.关闭虚拟机,添加磁盘 2.添加硬件向导 硬件类型 你要安装哪类硬件? 点击完成观察到已经成功添加磁盘 3.开启 ...

  3. swap分区扩展的三种方法

    redhat linux swap分区扩展的三种方法 2016-12-26 11:41:08 分类: LINUX 原文地址:redhat linux swap分区扩展的三种方法 作者:quanshen ...

  4. 4、传统三层架构与DDD分层架构

    4.传统三层架构与DDD分层架构 模型是抽象的 现实是形象的 技巧是重要的 思想是永恒的 从传统三层架构与DDD分层架构的编程演变其实是思想的演变. 传统三层架构,即用户界面层UI.业务逻辑层BAL. ...

  5. SpringBoot:自定义注解实现后台接收Json参数

    0.需求 在实际的开发过程中,服务间调用一般使用Json传参的模式,SpringBoot项目无法使用@RequestParam接收Json传参 只有@RequestBody支持Json,但是每次为了一 ...

  6. Linux 下命令有哪几种可使用的通配符?分别代表什么含义?

    "?"可替代单个字符. "*"可替代任意多个字符. 方括号"[charset]"可替代 charset 集中的任何单个字符,如[a-z],[ ...

  7. JDBC如何解决乱码

    只要在连接URL字符里添加参数 ?useUnicode=true&characterEncoding=utf-8 完整的URL字符串如下: 1 String url = "jdbc: ...

  8. jQuery--子元素过滤

    1.子元素过滤器介绍 :nth-child 获得指定索引的孩子,从1开始 :first-child 获得第一个孩子 :last-child 获得最后一个孩子 :only-child 获得独生子 2.代 ...

  9. MariaDB InnoDB基本介绍

    InnoDB锁定模式 事务获取锁,以防止并发事务修改甚至读取某些行或行范围.这样做是为了确保并发写入操作不会冲突. 共享锁(S)和排他锁(X) 两种标准的行级锁是共享锁(S)和排他锁(X) 获取共享锁 ...

  10. windows服务器下frp实现内网穿透

    一.操作步骤 1.服务器:首先在服务器上解压到相应目录并配置frps.ini文件如下: 2.服务器:按下windows+R输入cmd进入命令窗口,进入到安装目录下运行frps.exe -c frps. ...