Leetcode216/39/40/77之回溯解决经典组合问题
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之回溯解决经典组合问题的更多相关文章
- python实例:解决经典扑克牌游戏 -- 四张牌凑24点 (二)
Hey! 如果你还没有看这篇的上文的话,可以去稍稍瞅一眼,会帮助加速理解这一篇里面涉及到的递归结构哦!(上一篇点这里:<python实例:解决经典扑克牌游戏 -- 四张牌凑24点 (一)> ...
- 三十五、lamp经典组合搭建
一.安装mysql数据库 1.1 创建组和用户: 1)groupadd mysql 2)useradd mysql -g mysql -M -s /sbin/nologin 3)config ...
- python实例:解决经典扑克牌游戏 -- 四张牌凑24点 (一)
Hey! Hope you had a great day so far! 今天想和大家讨论的是一道我从这学期cs的期末考试得到灵感的题:Get 24 Poker Game.说到 Get 24 Pok ...
- 39. Combination Sum(medium, backtrack 的经典应用, 重要)
Given a set of candidate numbers (C) (without duplicates) and a target number (T), find all unique c ...
- <BackTracking> dfs: 39 40
39. Combination Sum Combination,组合问题用DFS罗列全部的答案. class Solution { public List<List<Integer> ...
- leetcode四道组合总和问题总结(39+40+216+377)
39题目: 链接:https://leetcode-cn.com/problems/combination-sum/ 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 ...
- 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 ...
- 77. Combinations(回溯)
Given two integers n and k, return all possible combinations of k numbers out of 1 ... n. Example: I ...
- c++回溯法求组合问题(取数,选取问题)从n个元素中选出m个的回溯算法
假如现在有n个数,分别从里面选择m个出来,那么一共有多少种不同的组合呢,分别是哪些呢? 利用计算机的计算力,采用回溯算法很容易求解 程序源代码如下: #include<iostream># ...
随机推荐
- interrupt(),interrupted() 和 isInterrupted() 的区别
1. 结论先行 interrupt():将调用该方法的对象所表示的线程标记一个停止标记,并不是真的停止该线程. interrupted():获取当前线程的中断状态,并且会清除线程的状态标记.是一个是静 ...
- Docker——容器数据卷
为什么需要容器数据卷 角度:遇到问题,尝试以朴素的道理解决问题.问题复杂化,解决的方式也变得复杂 问题的提出:docker将应用和环境打包成一个镜像,但是对于容器内的数据,如果不进行外部的保存,那么当 ...
- kernel热补丁
kernel正在运行的函数,如何实现地址替换的,高并发情况下,如何打热补丁
- CVE-2019-0708 RCE复现
漏洞环境 192.168.91.136 windows7 6.1.7601 192.168.91.151 kali Windows7 SP1下载链接: ed2k://|file|cn ...
- sqlmap的常用tamper脚本
sqlmap下的tamper目录存放绕过WAF脚本 使用方法 --tamper 脚本名称,脚本名称 多个tamper脚本之间用空格隔开 apostrophemask.py 用utf8代替引号 equa ...
- 架构师成长之路也该了解的新一代微服务技术-ServiceMesh(上)
架构演进 发展历程 我们再来回顾一下架构发展历程,从前往后的顺序依次为单机小型机->垂直拆分->集群化负载均衡->服务化改造架构->服务治理->微服务时代 单机小型机:采 ...
- Arduino UNO开发板、Arduino CNC Shield V3.0扩展板、A4988驱动板、grbl固件使用教程
前言 CNC Shield V3.0可用作雕刻机,3D打印机等的驱动扩展板,板上一共有4路步进电机驱动模块的插槽,可驱动4路不进电机,而每一路步进电机都只需要2个IO口,也就是说,6个IO口就可以很好 ...
- 《Win10——如何进入高级启动选项?》
Win10--如何进入高级启动选项? 第一种方法: 管理员命令提示符输入如下代码,自动重启并进入高级启动选项. shutdown /r /o /f /t 00 第二种方法: 1. ...
- ubuntu16 和ubuntu18安装及设置静态ip
1.准备ubuntu16镜像2.安装:https://zhuanlan.zhihu.com/p/1447048653.安装ubuntu后,sudo passwd root这个命令建立root用户的密码 ...
- mac 安装shell
https://blog.csdn.net/weixin_41937552/article/details/108565705