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># ...
随机推荐
- 七天接手react项目 系列
七天接手react项目 背景 假如七天后必须接手一个 react 项目(spug - 一个开源运维平台),而笔者只会 vue,之前没有接触过 react,此刻能做的就是立刻展开一个"7天 r ...
- 设计模式在 Spring 中的应用
Spring作为业界的经典框架,无论是在架构设计方面,还是在代码编写方面,都堪称行内典范.好了,话不多说,开始今天的内容. spring中常用的设计模式达到九种,我们一一举例: 第一种:简单工厂 又叫 ...
- 关于OAuth2.0 Authorization Code + PKCE flow在原生客户端(Native App)下集成的一点思考
写在前面 前几天看了园友的一篇文章被广泛使用的OAuth2.0的密码模式已经废了,放弃吧 被再次提起: Implicit Flow Password Grant,均已被标记为Legacy,且OAuth ...
- 前端知识之JavaScript知识
前端之javaScript JavaScript html :展示文档内容的 css:控制文档的显示效果 js:控制文档的交互效果 是脚本语言 一种轻量级的编程语言 可插入html页面的编程代码 js ...
- phpcms手工注入教程
目标服务器(靶机):192.168.1.27 目标网站:http://192.168.1.27:8083 步骤: 一.靶机操作 1.进入靶机,查看IP地址: 开始-运行,输入cmd回车,出现命令行窗口 ...
- 重写(Override)与重载(Overload)的区别(面试题)
概念:重写(Override):是存在子父之间的关系,子类里定义的方法与父类里定义的方法具有相同的方法名以及相同的返回值和参数类型 重写规则: 1.方法名形参列表相同: 2.访问权限,子类大于等于父类 ...
- Android中的Coroutine协程原理详解
前言 协程是一个并发方案.也是一种思想. 传统意义上的协程是单线程的,面对io密集型任务他的内存消耗更少,进而效率高.但是面对计算密集型的任务不如多线程并行运算效率高. 不同的语言对于协程都有不同的实 ...
- Chroot 特性 ?
3.2.0 版本后,添加了 Chroot 特性,该特性允许每个客户端为自己设置一个命名 空间.如果一个客户端设置了 Chroot,那么该客户端对服务器的任何操作,都将 会被限制在其自己的命名空间下. ...
- Mybatis框架基础入门(四)--SqlMapConfig.xml配置文件简介
SqlMapConfig.xml中配置的内容和顺序如下: properties(属性) settings(全局配置参数) typeAliases(类型别名) typeHandlers(类型处理器) o ...
- springDataRedis忽略实体指定的属性
如果是通过 RedisRepository定义的实体,可能存在想要忽略的属性,那么,就可以 使用 org.springframework.data.annotation.Transient 注解,就可 ...