leetcode之全排列问题(Permutations)

2024-06-06 20:32

本文主要是介绍leetcode之全排列问题(Permutations),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在leetcode上,跟Permutations有关的题目:

  • 31 Next Permutation
  • 46 Permutations

一.31 Next Permutation

  31题是排列的入门题,给出[1,2,3,4],需给出下一排列[1,2,4,3]。这题有固定的解法,给定排序nums[n]=[1,4,2,7,6,5,3],n=0~6:

  1. 从序号6开始往前寻找第一对严格递减(即找到第一个小于的数,从后往前看)的两个数,在这里是[2,7],记作[i,j],从7→2是严格递减。
  2. 从序号6开始寻找第一个大于序号i的数2,找到数3序号k,交换数2序号i和数3序号k,得到[1,4,3,7,6,5,2]
  3. 将从j开始(从7开始)一直到最后的序列改为正序(此时的序列一定是逆序的),得到[1,4,3,2,5,6,7]

这里考虑两种极端情况[1,2,3,4,5,6,7]和[7,6,5,4,3,2,1]。
  前一种情况:[i,j]=[6,7],[k]=[7];交换i,k,即6和7;反转从k开始的序列,这种情况不特殊,可与一般情况的一起处理;
  后一种情况:i<0,j=0,直接全体逆序一下即可,这种情况特殊,不能和一般情况一起处理。

二.46 Permutations

本题可以有三种解法:

  1. 回溯法(此方法也是leetcode上提示的方法)
  2. 利用31题,只要知道一种排列,后续的都可以next出来
  3. 使用dfs

2.1 回溯法

  回溯法的本质是类似于枚举的搜索尝试过程,一般都带着条件去搜索,如果发现继续搜索下去也找不到最优解,那么在此点就开始回溯。一般我们将它的解空间转化转化为树的形式,这样便于理解。
  这里我们以排序[1,2,3,4]为例,画出它的解空间树。每当i=4的时候,说明已经找到了一个解。需要寻找下一个解。比如找到了第4层的2314后,这时已经到头了,我们需要回溯,返回到第3层,再返回到第2层的2314,然后沿着另外一条路到了第4层的2341,这样就找到了另一个解。
这里写图片描述
  在排列问题中,没有约束条件,没有约束条件的回溯有点像暴力穷举,要达到叶子结点才会回溯。如要有条件的话,就可以对解空间树进行剪枝,可以避免许多明显不必要搜索的路径。
  用递归实现的回溯比较简单易懂,回溯法一般有以下模板:

//用递归实现回溯的一般模板
void backTrack(int i) {if(i > n) {//到达叶子结点,分析此解是否最优return;}for(int k=low; k<high; k++) {if(fx()) {//满足约束条件a += nums[i];backTrack(i+1);a -= nums[i];//在回溯前进行状态的清零}}
}

  有许多经典的问题都可以用回溯法来解决,比如8皇后问题、01背包问题等。
  回归这道题目,下面给出这道题回溯解法。

public class Solution {public List<List<Integer>> permute(int[] nums) {List<List<Integer>> arrAll = new ArrayList<List<Integer>>();backTrack(0, nums, arrAll);return arrAll;}private void backTrack(int i, int[] nums, List<List<Integer>> arrAll) {if(i>=nums.length) {List<Integer> arr = new ArrayList<Integer>();for (int a : nums) {arr.add(a);}arrAll.add(arr);return;}for(int k=i; k<nums.length; k++) {exch(nums, i, k);backTrack(i+1, nums, arrAll);exch(nums, i, k);}}private void exch(int[] nums, int i, int k) {int temp = nums[i];nums[i] = nums[k];nums[k] = temp;}
}

2.2 next法

  用现成的next法
 

2.3 dfs法

【Reference】
46 Permutations三种不同的解法 https://leetcode.com/discuss/20474/share-my-three-different-solutions

这篇关于leetcode之全排列问题(Permutations)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1037151

相关文章

Springboot3统一返回类设计全过程(从问题到实现)

《Springboot3统一返回类设计全过程(从问题到实现)》文章介绍了如何在SpringBoot3中设计一个统一返回类,以实现前后端接口返回格式的一致性,该类包含状态码、描述信息、业务数据和时间戳,... 目录Spring Boot 3 统一返回类设计:从问题到实现一、核心需求:统一返回类要解决什么问题?

maven异常Invalid bound statement(not found)的问题解决

《maven异常Invalidboundstatement(notfound)的问题解决》本文详细介绍了Maven项目中常见的Invalidboundstatement异常及其解决方案,文中通过... 目录Maven异常:Invalid bound statement (not found) 详解问题描述可

idea粘贴空格时显示NBSP的问题及解决方案

《idea粘贴空格时显示NBSP的问题及解决方案》在IDEA中粘贴代码时出现大量空格占位符NBSP,可以通过取消勾选AdvancedSettings中的相应选项来解决... 目录1、背景介绍2、解决办法3、处理完成总结1、背景介绍python在idehttp://www.chinasem.cna粘贴代码,出

SpringBoot整合Kafka启动失败的常见错误问题总结(推荐)

《SpringBoot整合Kafka启动失败的常见错误问题总结(推荐)》本文总结了SpringBoot项目整合Kafka启动失败的常见错误,包括Kafka服务器连接问题、序列化配置错误、依赖配置问题、... 目录一、Kafka服务器连接问题1. Kafka服务器无法连接2. 开发环境与生产环境网络不通二、序

SpringSecurity中的跨域问题处理方案

《SpringSecurity中的跨域问题处理方案》本文介绍了跨域资源共享(CORS)技术在JavaEE开发中的应用,详细讲解了CORS的工作原理,包括简单请求和非简单请求的处理方式,本文结合实例代码... 目录1.什么是CORS2.简单请求3.非简单请求4.Spring跨域解决方案4.1.@CrossOr

nacos服务无法注册到nacos服务中心问题及解决

《nacos服务无法注册到nacos服务中心问题及解决》本文详细描述了在Linux服务器上使用Tomcat启动Java程序时,服务无法注册到Nacos的排查过程,通过一系列排查步骤,发现问题出在Tom... 目录简介依赖异常情况排查断点调试原因解决NacosRegisterOnWar结果总结简介1、程序在

解决java.util.RandomAccessSubList cannot be cast to java.util.ArrayList错误的问题

《解决java.util.RandomAccessSubListcannotbecasttojava.util.ArrayList错误的问题》当你尝试将RandomAccessSubList... 目录Java.util.RandomAccessSubList cannot be cast to java.

Apache服务器IP自动跳转域名的问题及解决方案

《Apache服务器IP自动跳转域名的问题及解决方案》本教程将详细介绍如何通过Apache虚拟主机配置实现这一功能,并解决常见问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录​​问题背景​​解决方案​​方法 1:修改 httpd-vhosts.conf(推荐)​​步骤

java反序列化serialVersionUID不一致问题及解决

《java反序列化serialVersionUID不一致问题及解决》文章主要讨论了在Java中序列化和反序列化过程中遇到的问题,特别是当实体类的`serialVersionUID`发生变化或未设置时,... 目录前言一、序列化、反序列化二、解决方法总结前言serialVersionUID变化后,反序列化失

C++ 多态性实战之何时使用 virtual 和 override的问题解析

《C++多态性实战之何时使用virtual和override的问题解析》在面向对象编程中,多态是一个核心概念,很多开发者在遇到override编译错误时,不清楚是否需要将基类函数声明为virt... 目录C++ 多态性实战:何时使用 virtual 和 override?引言问题场景判断是否需要多态的三个关