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

46. 全排列 - 力扣(LeetCode)

基础知识要求:

Java:方法、集合、泛型、Arrays工具类、数组、for循环、if判断

Python: 方法、列表、for循环、if判断

题目: 

给定一个不含重复数字的数组 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 中的所有整数 互不相同

思路解析:

为了生成一个数组的所有可能全排列,我们可以使用回溯法(backtracking)。回溯法是一种通过探索所有可能的候选解来找出所有解的算法。如果候选解被确认不是一个解(或者至少不是最后一个解),回溯算法会通过在上一步进行一些更改来丢弃该解,即“回溯”并尝试其他可能的解。

Java代码示例:

import java.util.ArrayList;  
import java.util.Arrays;  
import java.util.List;  public class Permutations {  public List<List<Integer>> permute(int[] nums) {  List<List<Integer>> result = new ArrayList<>();  int n = nums.length;  boolean[] used = new boolean[n];  List<Integer> tempList = new ArrayList<>();  backtrack(nums, used, tempList, result, 0);  return result;  }  private void backtrack(int[] nums, boolean[] used, List<Integer> tempList, List<List<Integer>> result, int first) {  if (first == nums.length) {  result.add(new ArrayList<>(tempList)); // 添加当前排列到结果中  }  for (int i = 0; i < nums.length; i++) {  if (!used[i]) { // 如果当前数字没有被使用过  used[i] = true; // 标记为已使用  tempList.add(nums[i]); // 将当前数字添加到当前排列中  backtrack(nums, used, tempList, result, first + 1); // 递归进行下一个数字的排列  tempList.remove(tempList.size() - 1); // 回溯,撤销当前选择  used[i] = false; // 回溯,撤销使用标记  }  }  }  public static void main(String[] args) {  Permutations permutations = new Permutations();  int[] nums = {1, 2, 3};  List<List<Integer>> result = permutations.permute(nums);  for (List<Integer> permutation : result) {  System.out.println(permutation);  }  }  
}

Python代码示例:

def permute(nums):  def backtrack(first = 0):  # 如果所有整数都填完了  if first == n:    output.append(nums[:])  for i in range(first, n):  # 动态地维护数组  nums[first], nums[i] = nums[i], nums[first]  # 继续递归填下一个数  backtrack(first + 1)  # 撤销操作  nums[first], nums[i] = nums[i], nums[first]  n = len(nums)  output = []  backtrack()  return output  # 示例  
nums = [1,2,3]  
print(permute(nums))

相关文章:

  • SpringJDBC
  • ubuntu24.04LVM扩容问题
  • 【强化学习04】Q学习时序差分法
  • 操作系统 - 输入/输出(I/O)管理
  • 【PHP小课堂】学习了解PHP中Memcached扩展的使用
  • 26计算机操作系统408考研--操作系统处理机调度篇章(五)
  • 每天一个数据分析题(三百三十五)
  • 【软件工程】【23.04】p1
  • 关于我转生从零开始学C++这件事:升级Lv.25
  • 【MySQL精通之路】SQL优化(1)-查询优化(9)-外部联接优化
  • 深入Java:JSON解析与操作的艺术
  • Ubuntu安装IPOPT和Casadi
  • 打印机里失败的任务删不掉的解决办法 斑马打印机更新电脑驱动和升级打印机固件 提示ribbon out 并黄状态亮+黄供应闪
  • python列表底层原理
  • 视图【mysql数据库】
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • 【译】理解JavaScript:new 关键字
  • const let
  • es6(二):字符串的扩展
  • gops —— Go 程序诊断分析工具
  • happypack两次报错的问题
  • Javascript设计模式学习之Observer(观察者)模式
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • vue自定义指令实现v-tap插件
  • 普通函数和构造函数的区别
  • 山寨一个 Promise
  • 学习笔记TF060:图像语音结合,看图说话
  • 智能网联汽车信息安全
  • 摩拜创始人胡玮炜也彻底离开了,共享单车行业还有未来吗? ...
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • #14vue3生成表单并跳转到外部地址的方式
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (4)STL算法之比较
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (windows2012共享文件夹和防火墙设置
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (第27天)Oracle 数据泵转换分区表
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (回溯) LeetCode 77. 组合
  • (力扣)循环队列的实现与详解(C语言)
  • (七)理解angular中的module和injector,即依赖注入
  • (区间dp) (经典例题) 石子合并
  • (五)activiti-modeler 编辑器初步优化
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • (源码分析)springsecurity认证授权
  • (转)负载均衡,回话保持,cookie
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • .net Signalr 使用笔记
  • .net websocket 获取http登录的用户_如何解密浏览器的登录密码?获取浏览器内用户信息?...
  • .NET 项目中发送电子邮件异步处理和错误机制的解决方案
  • .net8.0与halcon编程环境构建
  • .NetCore 如何动态路由
  • .NET文档生成工具ADB使用图文教程