全排列(046)

class Solution {
List<List<Integer>> res = new ArrayList<>();
public List<List<Integer>> permute(int[] nums) {
int n = nums.length;
List<Integer> path = new ArrayList<>(n);
for (int num : nums){
path.add(num);
} backTrack(0, path, n);
return res;
} private void backTrack(int idx, List<Integer> path, int len){
if (idx == len-1){
res.add(new ArrayList(path));
return;
} for (int i = idx; i < len; i++){
Collections.swap(path, idx, i);
backTrack(idx+1, path, len);
Collections.swap(path, idx, i);
}
}
}
  • 分析

根据排列组合, 我们可以得到 答案的数量为 nums.length()的阶乘

假设 n = nums.length =3

对于第一个数的选择有三种可能 ∗3

对于第二个数的选择有两种可能 ∗2(两个数未选)

对于第三个数的选择有一种可能 ∗1(一个数未选)

有以下关键代码

for (int i = idx; i < len; i++){
Collections.swap(path, idx, i);
backTrack(idx+1, path, len);
Collections.swap(path, idx, i);
}

子集(078)

class Solution {
List<List<Integer>> res = new ArrayList<>();
public List<List<Integer>> subsets(int[] nums) {
int n = nums.length;
List<Integer> path = new ArrayList<>();
backTrace(0, path, nums, n);
return res;
} private void backTrace(int idx, List<Integer> path, int[] nums, int len){
if (idx == len){
res.add(new ArrayList(path));
return;
}
path.add(nums[idx]);
backTrace(idx+1, path, nums, len);
path.remove(path.size()-1);
backTrace(idx+1, path, nums, len);
}
}
  • 分析

标准的背包问题, 选或不选

电话号码的字母组合(017)

class Solution {
String[] mapping = new String[] { "", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz" };
List<String> res = new ArrayList<>();
public List<String> letterCombinations(String digits) {
int n = digits.length();
if (!digits.isEmpty()) backTrace(0, digits, new StringBuilder(), n);
return res;
} private void backTrace(int idx, String digits, StringBuilder builder, int len){
if (idx == len){
res.add(builder.toString());
return;
} char c = digits.charAt(idx);
c -= '0';
for (char d : mapping[c].toCharArray()){
builder.append(d);
backTrace(idx+1, digits, builder, len);
builder.deleteCharAt(builder.length()-1);
}
}
}
  • 分析

标准简单回溯

组合总和(039)

class Solution {
List<List<Integer>> res = new ArrayList<>();
public List<List<Integer>> combinationSum(int[] candidates, int target) {
Arrays.sort(candidates);
List<Integer> path = new ArrayList<>();
backTrace(0, target, path, candidates);
return res;
}
private void backTrace(int idx, int target, List<Integer> path, int[] candidates){
if (target == 0){
res.add(new ArrayList(path));
return;
} if (idx == candidates.length || target < candidates[idx]) return; backTrace(idx+1, target, path, candidates);
path.add(candidates[idx]);
backTrace(idx, target - candidates[idx], path, candidates);
path.remove(path.size()-1);
}
}
  • 分析

我愿称他为原地背包, 也不知道有没有这种说法

括号生成(022)

class Solution {
List<String> res = new ArrayList<>();
public List<String> generateParenthesis(int n) {
StringBuilder builder = new StringBuilder();
backTrace(n, n, builder);
return res;
}
private void backTrace(int lef, int rig, StringBuilder builder){
if (lef > rig || lef < 0 || rig < 0) return;
if (lef == 0 && rig == 0){
res.add(builder.toString());
return;
} backTrace(lef-1, rig, builder.append('('));
builder.deleteCharAt(builder.length()-1);
backTrace(lef, rig-1, builder.append(')'));
builder.deleteCharAt(builder.length()-1);
}
}
  • 分析

标准回溯 + 括号 →<右括号数量不能大于左括号>的限制条件

hot100之回溯上的更多相关文章

  1. prolog --寻找neni (2)

    混合查询 我们可以把简单的查询连接起来,组成复杂的查询. ?- location(X,kitchen),edible(X). 简单查询只有一个目标,而混合查询可以把这些目标连接起来.从而进行较为复杂的 ...

  2. this prototype 闭包 总结

    this对象 整理下思路: 一般用到this中的情景: 1.构造方法中 function A(){ this.name="yinshen"; } var a=new A(); co ...

  3. leetcode[91] Subsets II

    给定一个数组,返回所有的非重复的可能.例如给定 If S = [1,2,2], a solution is: [ [2], [1], [1,2,2], [2,2], [1,2], [] ] 其实这题类 ...

  4. jquery的2.0.3版本源码系列(3):96行-283行,给JQ对象,添加一些方法和属性

    jquery是面向对象的程序,面向对象就离不开方法和属性. 方法的简化 jQuery.fn=jQuery.prototype={ jquery: 版本 constructor: 修正指向问题 init ...

  5. 胡小兔的OI日志3 完结版

    胡小兔的 OI 日志 3 (2017.9.1 ~ 2017.10.11) 标签: 日记 查看最新 2017-09-02 51nod 1378 夹克老爷的愤怒 | 树形DP 夹克老爷逢三抽一之后,由于采 ...

  6. UVa11212,Editing a Book

    正如书上所说,本题需要用IDA*算法求解 启发函数是3d+h>3maxd(d为当前操作步骤数,h为当前逆序对数,maxd为当前枚举的最大步骤数) 可见迭代递归的核心思想是枚举ans去dfs是否可 ...

  7. C# 数独算法——LINQ+委托

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Sing ...

  8. 剑指offer(65)矩阵中的路径

    题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩阵中 ...

  9. 数据结构——串(KMP)

    空串:长度为0的串 空格串:由一个或多个空格组成的串 串常用的3种机内表示方法: 定长顺序存储表示: 用一组地址连续的存储单元存储串的字符序列,每一个串变量都有一个固定长度的存储区,可用定长数组来描述 ...

  10. 剑指offer(27)字符串的排列

    题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入描述:输入 ...

随机推荐

  1. 有限Abel群的结构(1)

    版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖.如要转贴,必须注明原文网址 https://www.cnblogs.com/Colin-Cai/p/18774816.html 作者:窗户 ...

  2. Redis 是什么?

    Redis 的定义?   百度百科: Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.K ...

  3. IDA Pro分析dll在exe中的表现

    尝试分析隐式加载和显式加载的dll在exe中进行反汇编时的表现. 1. 测试条件 (1)动态库 testdll1  导出函数 int add(int, int) 和  int add2(int, in ...

  4. 模板设计模式--java进阶day03

    1.模板设计模式 说到模板,我们第一时间想到的可能就是写作文 不过这样写就是一篇完整的作文,我们应该进行修改 这样修改还会存在一个问题,每一个人写的作文不同,中间的body()无法描述清楚,所以我们要 ...

  5. 【Python】import模块和包

    模块和包 一. 模块 Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句. 模块能定义函数,类和变量,模块里也能包含可执 ...

  6. 详细介绍FutureTask类

    一.详细介绍FutureTask类 FutureTask 未来将要执行的任务对象,继承 Runnable.Future 接口,用于包装 Callable 对象,实现任务的提交 public stati ...

  7. 阿里云OSS前端直传

    注意: oss直传request与global对象冲突 <script src="http://gosspublic.alicdn.com/aliyun-oss-sdk-6.9.0.m ...

  8. VTK 入门系列之二:为三维场景添加坐标轴

    一.引言 在进行三维可视化开发时,我们常常希望能够清晰了解模型在空间中的位置.方向与比例关系.而最直观的辅助工具就是三维坐标轴(Axes).在 VTK 中,vtkAxesActor 提供了一种开箱即用 ...

  9. MCP-Playwright:AI自动化神器,一款超级好用的自动化测试框架!

    在软件开发与测试领域,自动化测试早已成为提升效率.保障质量的核心工具.然而,传统自动化测试框架往往面临代码编写繁琐.跨工具协作困难.操作复杂等痛点. 而今天,给大家介绍一款自动化测试工具:MCP-Pl ...

  10. 【记录】VScode|两种缩放快捷键的功能和开启方式(Ctrl+/-,Ctrl滚轮)

    1 面板缩放 快捷键:Ctrl+'+'/'-'. 2 滚轮缩放字体 快捷键:Ctrl+滚轮 开启方式:如下图,打开设置,搜索zoom,勾选. 更多快捷键:Ctrl+K Ctrl+S打开快捷键设置(或左 ...