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. Re:《Unity Shader入门精要》13.3全局雾效--如何从深度纹理重构世界坐标

    如何从深度纹理重构世界坐标 游戏特效,后处理是必不可少的,而后处理经常需要我们得到当前画面的像素对应世界空间的所有信息. 思路 通过深度纹理取得NDC坐标,然后再通过NDC坐标还原成世界空间坐标 // ...

  2. e值计算来了

    e值该如何计算呢? 若关于ex幂级数展开 ex=1+x+x2/2!+x3/3!+•••+xn/n! 取x=1,有e=1+1/2+1/6+••• 接下来就是十分简单的编程 这里选用了python语言(当 ...

  3. web note

    web note html note 列表 ul 无序列表 ol 有序列表 并且可以通过 type 来定义列表序号的形式 <!DOCTYPE html> <html> < ...

  4. mysql优化参数 (汇总)

    1 如下为128G内存32线程处理器的mariadb配置参数优化: [client]#password= your_passwordport= 3306 socket= /tmp/mysql.sock ...

  5. Linux安全加固手册

    1      身份鉴别 1.1         密码安全策略 操作系统和数据库系统管理用户身份鉴别信息应具有不易被冒用的特点,口令应有复杂度要求并定期更换. 设置有效的密码策略,防止攻击者破解出密码 ...

  6. Redis的Unable to connect to Redis和java.io.IOException: 远程主机强迫关闭了一个现有的连接问题的解决

      学习项目xhr系统用到springboot + vue(https://github.com/lenve/vhr),文档中要求使用到RabbitMQ,但是从我搭建开发环境来看,是否配置Rabbit ...

  7. matplotlib字体

    matplotlib官方文档 https://matplotlib.org/stable/gallery/index.html 使用以下代码查看 import matplotlib.pyplot as ...

  8. luoguP4383 [八省联考2018]林克卡特树(树上dp,wqs二分)

    luoguP4383 [八省联考2018]林克卡特树(树上dp,wqs二分) Luogu 题解时间 $ k $ 条边权为 $ 0 $ 的边. 是的,边权为零. 转化成选正好 $ k+1 $ 条链. $ ...

  9. bzoj3545/bzoj3551 [ONTAK2010]Peaks/Peaks加强版

    bzoj3545/bzoj3551 [ONTAK2010]Peaks/Peaks加强版 传送门:bzoj  bzoj wdnmd为什么加强版不是权限题原题却是啊 3545: [ONTAK2010]Pe ...

  10. Java如何使用实时流式计算处理?

    我是3y,一年CRUD经验用十年的markdown程序员‍常年被誉为职业八股文选手 最近如果拉过austin项目代码的同学,可能就会发现多了一个austin-stream模块.其实并不会意外,因为这一 ...