全排列 - 三种形式

全排列 - 三种形式

思路 - 回溯

  1. 「路径」,记录已经做过的选择
  2. 「选择列表- 多叉树」,表示当前可以做出的选择,在前序和后序位置操作。
    1. 前序位置,做选择
    2. 进入下一层决策树
    3. 后序位置,撤销选择
  3. 「结束条件」 遍历到树的底层叶子节点

46. 全排列 - 元素无重不可复选

给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。

题解

public List<List<Integer>> res = new LinkedList<>(); // 记录结果
public LinkedList<Integer> track = new LinkedList<>(); // 记录路径
public List<List<Integer>> permute(int[] nums) {backtrack(nums);return res;
}
// 回溯
public void backtrack(int[] nums) {// 结束条件,base case,到达叶子节点if (track.size() == nums.length) {// 找出一个全排列,退出。不能直接add(track),track引用的对象一直在变化,最后track为空,导致res添加的所有track也全都为空。res.add(new LinkedList<>(track));return;}// 选择列表for (int i = 0; i < nums.length; i++) {// 已存在的路径排除,避免重复使用if (track.contains(nums[i])) continue;track.add(nums[i]); // 前序位置,做选择backtrack(nums); // 进入下一层决策树track.removeLast(); // 后序位置,撤销选择}
}

避免重复选择

  1. 使用集合的 contains() 方法判断
  2. 使用 used数组 标记还可以被选择的元素

变种:求元素个数为 k 的排列

// 求元素个数为 k 的排列
public void backtrack(int[] nums, int k) {if (track.size() == k) {res.add(new LinkedList<>(track));return;}for (int i = 0; i < nums.length; i++) {if (track.contains(nums[i])) continue;track.add(nums[i]);backtrack(nums, k);track.removeLast();}
}

47. 全排列 II - 元素可重不可复选

给定一个可包含重复数字的序列 nums按任意顺序 返回所有不重复的全排列。

题解

方法一:保证相同元素在排列中的相对位置保持不变

public List<List<Integer>> res = new LinkedList<>();
public LinkedList<Integer> track = new LinkedList<>();
public boolean[] used;
public List<List<Integer>> permuteUnique(int[] nums) {// 先排序,让相同元素靠在一起Arrays.sort(nums);used = new boolean[nums.length];backtrack(nums);return res;
}
// 剪枝,相同元素在排列中的相对位置保持不变
public void backtrack(int[] nums) {if (track.size() == nums.length) {res.add(new LinkedList<>(track));return;}for (int i = 0; i < nums.length; i++) {if (used[i]) continue; // 剪枝,已访问过,跳出if (i > 0 && nums[i] == nums[i - 1] && !used[i - 1]) continue; // 剪枝,没有访问过的树枝,若值相同,跳过(相对位置改变导致重复啦,要跳过)track.add(nums[i]);used[i] = true;backtrack(nums);track.removeLast();used[i] = false;}
}

方法二:记录前一条树枝的值,相同的只遍历第一个树枝,其它跳过

public void backtrack2(int[] nums) {if (track.size() == nums.length) {res.add(new LinkedList<>(track));return;}// 记录前一条树枝的值,初始化为特殊值int prevNum = -110;for (int i = 0; i < nums.length; i++) {if (used[i]) continue; // 剪枝,已访问过,跳出if (prevNum == nums[i]) continue; // 剪枝,相同则跳过,去重复track.add(nums[i]);used[i] = true;prevNum = nums[i]; // 记录这条树枝上的值backtrack2(nums);track.removeLast();used[i] = false;}
}

方法三:set去重

// 方法三 ,找出全排列, 然后通过set去重,效率低
// public Set<List<Integer>> set = new HashSet<>();

全排列 III - 元素无重可复选

允许重复使用元素,去除剪枝逻辑即可。

public List<List<Integer>> res = new LinkedList<>(); // 结果
public LinkedList<Integer> track = new LinkedList<>(); // list记录路径
public List<List<Integer>> permute(int[] nums) {backtrack(nums);return res;
}
/*** 回溯*/
public void backtrack(int[] nums) {// base case,到达叶子节点if (track.size() == nums.length) {// 收集叶子节点上的值res.add(new LinkedList<>(track));return;}for (int i = 0; i < nums.length; i++) {track.add(nums[i]); // 做选择backtrack(nums); // 进入下一层决策树track.removeLast(); // 撤销选择}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/664966.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

全面认识DOS系统

目录 一、DOS系统的功能 1.执行命令和程序&#xff08;处理器管理&#xff09; 2.内存管理 3.设备管理 4.文件管理 5.作业管理 二、文件与目录 三、文件类型与属性 1.系统属性&#xff08;S&#xff09; 2.隐含属性&#xff08;H&#xff09; 3.只读属性&#xff08…

初谈类和对象

文章目录 前言类的引入类的定义类的两种定义方式成员命名规则 类的访问限定符及封装访问限定符面试题封装 类的作用域类的实例化类对象模型计算类对象的大小 this指针this指针特性 前言 C语言是面向过程的&#xff0c;关注点是过程&#xff1b;而C面向的是对象&#xff0c;关注…

mysql-FIND_IN_SET查询优化

优化前 SELECTuser_id,user_name,real_name,PASSWORD,real_org_id,real_org_name,real_dept_id,real_dept_name, STATUS FROMsys_user WHEREis_del 0 AND find_in_set( lilong, login_user_account ) 优化后 SELECTuser_id,user_name,real_name,PASSWORD,real_org_id,real…

回归预测 | Matlab实现RIME-CNN-LSTM-Attention霜冰优化卷积长短期记忆网络注意力多变量回归预测(SE注意力机制)

回归预测 | Matlab实现RIME-CNN-LSTM-Attention霜冰优化卷积长短期记忆网络注意力多变量回归预测&#xff08;SE注意力机制&#xff09; 目录 回归预测 | Matlab实现RIME-CNN-LSTM-Attention霜冰优化卷积长短期记忆网络注意力多变量回归预测&#xff08;SE注意力机制&#xff0…

如何处理我们的文本数据成构建词表

我们拿到在拿到一堆语料数据&#xff0c;或者是在网络中爬取下来的文本数据如何处理成为模型能够训练的数据呢&#xff1f;这里有我们先经过停用词和按字分词的处理之后&#xff0c;得到的问答对文本数据&#xff0c;input_by_word.txt 和 target_by_word.txt 。其中&#xff0…

2024美赛预测算法 | 回归预测 | Matlab基于RIME-LSSVM霜冰算法优化最小二乘支持向量机的数据多输入单输出回归预测

2024美赛预测算法 | 回归预测 | Matlab基于RIME-LSSVM霜冰算法优化最小二乘支持向量机的数据多输入单输出回归预测 目录 2024美赛预测算法 | 回归预测 | Matlab基于RIME-LSSVM霜冰算法优化最小二乘支持向量机的数据多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效…

5、DSP28335 串口发送接收FIFO中断,自定义printf函数

#include "uart.h"unsigned char data[8];void MyUartInit(Uint32 baud) {unsigned char scihbaud 0;unsigned char scilbaud 0;Uint16 scibaud 0;EALLOW;InitSciaGpio();EDIS;EALLOW;//0&#xff1a;一位停止位&#xff1b;1&#xff1a;两位停止位SciaRegs.SCIC…

Docker进阶篇-Docker网络

一、描述 1、docker不启动&#xff0c;默认网络情况 查看网卡情况使用&#xff0c;ifconfig或者ip addr ens33&#xff1a;本机网卡 lo&#xff1a;本机回环网络网卡 virbr0:在CentoS 7的安装过程中如果有选择相关虚拟化的的服务安装系统后&#xff0c;启动网卡时会发现 …

Web实战丨基于Django的简单网页计数器

文章目录 写在前面Django简介主要程序运行结果系列文章写在后面 写在前面 本期内容 基于django的简单网页计数器 所需环境 pythonpycharm或vscodedjango 下载地址 https://download.csdn.net/download/m0_68111267/88795604 Django简介 Django 是一个用 Python 编写的高…

游戏找不到d3dcompiler_43.dll怎么办?多种5种解决方法分享

在运行游戏的过程中&#xff0c;系统遇到了一个关键性的问题&#xff0c;即无法成功找到名为“d3dcompiler_43.dll”的动态链接库文件。这一特定的dll文件对于游戏的正常启动和图形渲染至关重要&#xff0c;它的缺失可能会导致游戏无法运行或者画面无法正确显示。通常情况下&am…

day07-CSS高级

01-定位 作用&#xff1a;灵活的改变盒子在网页中的位置 实现&#xff1a; 1.定位模式&#xff1a;position 2.边偏移&#xff1a;设置盒子的位置 left right top bottom 相对定位 position: relative 特点&#xff1a; 不脱标&#xff0c;占用自己原来位置 显示模…

10秒搞定!隔壁奶奶都能搞定的幻兽帕鲁、雾锁王国开服指南

最近《幻兽帕鲁》和《雾锁王国》非常火热&#xff0c;玩过的小伙伴们都说非常上头&#xff01;有跟朋友对战需求的小伙伴们可以通过本文拥有一台高性价比的专用服务器&#xff0c;随时可以用来跟朋友一起玩游戏&#xff01; 敲重点&#xff01;&#xff01;&#xff01; 步骤…

2021-10-14 51蛋骗鸡1秒变动0-9按键控制并蜂鸣器响

缘由单片机程序设计与应用-Python-CSDN问答 #include "REG52.h" sbit K1 P3^0; sbit K2 P3^1; sbit K3 P3^2; sbit K4 P3^3; sbit bpP3^4; bit k1,wk0; unsigned char code SmZiFu[]{63,6,91,79,102,109,125,7,127,111,128,255,64};//0-9.消隐- unsigned char J…

【深度学习: 计算机视觉】如何改进计算机视觉数据集

【深度学习&#xff1a; 计算机视觉】如何改进计算机视觉数据集 训练模型并评估性能确定数据集需要改进的原因和位置收集或创建新的图像或视频数据重新训练机器学习模型并重新评估&#xff0c;直到达到所需的性能标准 机器学习算法需要大量数据集来训练、提高性能并生成组织所需…

基于SpringBoot+Vue的高校在线答疑管理系统

末尾获取源码作者介绍&#xff1a;大家好&#xff0c;我是墨韵&#xff0c;本人4年开发经验&#xff0c;专注定制项目开发 更多项目&#xff1a;CSDN主页YAML墨韵 学如逆水行舟&#xff0c;不进则退。学习如赶路&#xff0c;不能慢一步。 目录 一、项目简介 二、开发技术与环…

代码随想录算法训练营day38 || 509. 斐波那契数,70. 爬楼梯,746. 使用最小花费爬楼梯

视频讲解&#xff1a; 手把手带你入门动态规划 | LeetCode&#xff1a;509.斐波那契数_哔哩哔哩_bilibili 带你学透动态规划-爬楼梯&#xff08;对应力扣70.爬楼梯&#xff09;| 动态规划经典入门题目_哔哩哔哩_bilibili 动态规划开更了&#xff01;| LeetCode&#xff1a;746.…

P8598 [蓝桥杯 2013 省 AB] 错误票据--2024蓝桥杯冲刺省一

点击跳转例题 思路: 直接进行模拟即可,需要注意的是有很多细节. 首先输入的问题:每个例子没有给出数量,那么我们怎么办呢? 当然是直接读入一整行! 那么我们如何分割呢?这里引入stringstream(知识总结); 利用getline()读入一整行,stringstream来过滤掉空格; #include <b…

springwebflux高性能服务

场景&#xff1a; 分别使用springwebmvc 使用tomcat &#xff08;tomcat 9&#xff09;和springwebflux 做一个简单的接口 &#xff0c;该接口返回一个随机数 压测环境&#xff1a; 4C 8G ECS 使用tomcat 压测结果 Max 抖动的厉害 保持压测的参数不变 使用webflux 压测结果 …

Power Designer的使用 创建数据库表模型

几年前用过PowerDesigner&#xff0c;好几年没用&#xff0c;有点忘记了&#xff0c;在这里记个笔记&#xff0c;需要的时候翻一翻 PowerDesigner版本16.5 下面的例子是以MySQL数据库为准 生成C#实体类 一 安装 1.1 安装 不让放网盘链接&#xff0c;审核通不过。。。。 …

【常见的Web前端框架——详细介绍】

常见的Web前端框架——详细介绍 常见的Web前端框架介绍 常见的Web前端框架介绍 Web前端开发工具和技术可以快速地发展和变化&#xff0c;但截至2023年&#xff0c;以下是一些常见和受欢迎的Web前端框架&#xff0c;每个都有自己独特的功能和用例。 React 由Facebook开发和维护…