当前位置: 首页 > news >正文

力扣经典算法篇-43-全排列(经典回溯问题)

1、题干

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

示例 1:
输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

示例 2:
输入:nums = [0,1]
输出:[[0,1],[1,0]]

示例 3:
输入:nums = [1]
输出:[[1]]

提示:
1 <= nums.length <= 6
-10 <= nums[i] <= 10
nums 中的所有整数 互不相同

2、解题

数组的全排列是经典的回溯策略问题。

方法一:(回溯法)

回溯的基本实现步骤要搞清楚。
找到固定不变的量,每趟递归动态变化的量,结果集。
递归就一定要有终止条件,终止条件则呀要添加结果到结果集合中了。
循环递归,注意要先添加元素向前递归,之后进行回退操作;怎么添加的元素进行向后递归,就要怎么删除元素进行回溯。

注意本例要求的元素不能有重复,所以临时动态变量,除了要添加元素的下标,本趟的结果集,还要添加一个set集合用于验证是否重复添加元素。所以在循环递归前,不仅要添加当前元素,还要添加记录下标;在回溯的时候添加的什么,就要删除什么。

代码示例:

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;public class Test49 {public static List<List<Integer>> permute(int[] nums) {// 结果集合List<List<Integer>> result = new ArrayList<>();// 动态变化的临时量// 保存每趟的元素List<Integer> tempList = new ArrayList<>();// 每趟操作需要添加的下标值int index = 0;// 已添加元素的下标值,用于防止重复添加HashSet<Integer> hasSet = new HashSet<>();// 递归(不变的nums,动态tempList,index,hasSet,结果集result)goAndBack(nums, tempList, index, hasSet, result);return result;}private static void goAndBack(int[] nums, List<Integer> tempList, int index, Set<Integer> hasIndex, List<List<Integer>> result) {if (tempList.size() == nums.length) {// 终止条件,本趟元素达到最大元素,注意要新new出来,不然result添加的引用会是同一个。result.add(new ArrayList<>(tempList));return;}// 循环变量for (int i = 0; i < nums.length; i++) {if (!hasIndex.contains(i)) {// 添加元素,记录下标位置hasIndex.add(i);tempList.add(nums[i]);// 向后递归goAndBack(nums, tempList, index + 1, hasIndex, result);// 删除元素,删除下标位置,向前回溯tempList.remove(index);hasIndex.remove(i);}}}public static void main(String[] args) {int[] nums = {1, 2, 3};System.out.println(permute(nums));}
}

向阳前行,Dare To Be!!!

http://www.dtcms.com/a/315756.html

相关文章:

  • vite面试题及详细答案120题(01-30)
  • 普通树状数组
  • 《Node.js与 Elasticsearch的全文搜索架构解析》
  • Leetcode 13 java
  • 2025-08-05Gitee + PicGo + Typora搭建免费图床
  • MongoDB学习专题(二)核心操作
  • MongoDB 从3.4.0升级到4.0.0完整指南实战-优雅草蜻蜓I即时通讯水银版成功升级-卓伊凡|bigniu
  • 时序数据库flux aggregateWindow命令详解
  • Baumer相机如何通过YoloV8深度学习模型实现道路场所路人口罩的检测识别(C#代码UI界面版)
  • 概率论之条件概率
  • ubuntu自动重启BUG排查指南
  • C++ - 仿 RabbitMQ 实现消息队列--服务端核心模块实现(六)
  • Go 单元测试:如何只运行某个测试函数(精确控制)
  • C++ 网络编程入门:TCP 协议下的简易计算器项目
  • 【STM32】HAL库中的实现(四):RTC (实时时钟)
  • 日语学习-日语知识点小记-构建基础-JLPT-N3阶段(14):文法:ていく+きた+单词
  • MQTT学习
  • Starrocks 关于 trace 命令的说明
  • C# --- 本地缓存失效形成缓存击穿触发限流
  • 【面向对象】面向对象七大原则
  • 【乐企板式文件生成工程】关于乐企板式文件(PDF/OFD/XML)生成工程介绍
  • [2401MT-B] 面积比较
  • 翻译的本质:人工翻译vs机器翻译的核心差异与互补性
  • Starrocks中的 Query Profile以及explain analyze及trace命令中的区别
  • MySQL 中 VARCHAR 和 TEXT 的区别
  • 智慧酒店:科技赋能下的未来住宿新体验
  • Spring-rabbit使用实战六
  • 国产三防平板电脑是什么?三防平板推荐
  • Spark内核调度
  • RTC实时时钟RX8900SA国产替代FRTC8900S