LeetCode_31_中等_下一个排列
文章目录
- 1. 题目
- 2. 思路及代码实现详解(Python)
- 2.1 两遍扫描
1. 题目
整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。
例如, a r r = [ 1 , 2 , 3 ] arr = [1,2,3] arr=[1,2,3] ,以下这些都可以视作 a r r arr arr 的排列: [ 1 , 2 , 3 ] 、 [ 1 , 3 , 2 ] 、 [ 3 , 1 , 2 ] 、 [ 2 , 3 , 1 ] [1,2,3]、[1,3,2]、[3,1,2]、[2,3,1] [1,2,3]、[1,3,2]、[3,1,2]、[2,3,1]。整数数组的 下一个排列 是指其整数的下一个字典序更大的排列。更正式地,如果数组的所有排列根据其字典顺序从小到大排列在一个容器中,那么数组的 下一个排列 就是在这个有序容器中排在它后面的那个排列。如果不存在下一个更大的排列,那么这个数组必须重排为字典序最小的排列(即,其元素按升序排列)。
- 例如, a r r = [ 1 , 2 , 3 ] arr = [1,2,3] arr=[1,2,3] 的下一个排列是 [ 1 , 3 , 2 ] [1,3,2] [1,3,2] 。
- 类似地, a r r = [ 2 , 3 , 1 ] arr = [2,3,1] arr=[2,3,1] 的下一个排列是 [ 3 , 1 , 2 ] [3,1,2] [3,1,2] 。
- 而 a r r = [ 3 , 2 , 1 ] arr = [3,2,1] arr=[3,2,1] 的下一个排列是 [ 1 , 2 , 3 ] [1,2,3] [1,2,3] ,因为 [ 3 , 2 , 1 ] [3,2,1] [3,2,1] 不存在一个字典序更大的排列。
给你一个整数数组 n u m s nums nums ,找出 n u m s nums nums 的下一个排列。
必须 原地 修改,只允许使用额外常数空间。
示例 1:
输入: n u m s = [ 1 , 2 , 3 ] nums = [1,2,3] nums=[1,2,3]
输出: [ 1 , 3 , 2 ] [1,3,2] [1,3,2]
示例 2:
输入: n u m s = [ 3 , 2 , 1 ] nums = [3,2,1] nums=[3,2,1]
输出: [ 1 , 2 , 3 ] [1,2,3] [1,2,3]
示例 3:
输入: n u m s = [ 1 , 1 , 5 ] nums = [1,1,5] nums=[1,1,5]
输出: [ 1 , 5 , 1 ] [1,5,1] [1,5,1]
提示:
- 1 < = n u m s . l e n g t h < = 100 1 <= nums.length <= 100 1<=nums.length<=100
- 0 < = n u m s [ i ] < = 100 0 <= nums[i] <= 100 0<=nums[i]<=100
2. 思路及代码实现详解(Python)
本题要求实现一个算法,将给定数字序列重新排列成字典序中下一个更大的排列。
以数字序列 [ 1 , 2 , 3 ] [1,2,3] [1,2,3] 为例,其排列按照字典序依次为:
[ 1 , 2 , 3 ] [ 1 , 3 , 2 ] [ 2 , 1 , 3 ] [ 2 , 3 , 1 ] [ 3 , 1 , 2 ] [ 3 , 2 , 1 ] \begin{aligned} [1,2,3]\\ [1,3,2]\\ [2,1,3]\\ [2,3,1]\\ [3,1,2]\\ [3,2,1] \end{aligned} [1,2,3][1,3,2][2,1,3][2,3,1][3,1,2][3,2,1]
这样,排列 [ 2 , 3 , 1 ] [2,3,1] [2,3,1] 的下一个排列即为 [ 3 , 1 , 2 ] [3,1,2] [3,1,2]。特别的,最大的排列 [ 3 , 2 , 1 ] [3,2,1] [3,2,1] 的下一个排列为最小的排列 [ 1 , 2 , 3 ] [1,2,3] [1,2,3]。
2.1 两遍扫描
注意到下一个排列总是比当前排列要大,除非该排列已经是最大的排列。我们希望找到一种方法,能够找到一个大于当前序列的新序列,且变大的幅度尽可能小。具体地:
-
我们需要将一个左边的「较小数」与一个右边的「较大数」交换,以能够让当前排列变大,从而得到下一个排列。
-
同时我们要让这个「较小数」尽量靠右,而「较大数」尽可能小。当交换完成后,「较大数」右边的数需要按照升序重新排列。这样可以在保证新排列大于原来排列的情况下,使变大的幅度尽可能小。
以排列 [ 4 , 5 , 2 , 6 , 3 , 1 ] [4,5,2,6,3,1] [4,5,2,6,3,1] 为例:
-
我们能找到的符合条件的一对「较小数」与「较大数」的组合为 2 2 2 与 3 3 3,满足「较小数」尽量靠右,而「较大数」尽可能小,这里的「较大数」要比「较小数」大,且增大幅度尽量小,从右向左找到第一个非增的值即为「较小数」。
-
当我们完成交换后排列变为 [ 4 , 5 , 3 , 6 , 2 , 1 ] [4,5,3,6,2,1] [4,5,3,6,2,1],此时我们可以重排「较小数」右边的序列,序列变为 [ 4 , 5 , 3 , 1 , 2 , 6 ] [4,5,3,1,2,6] [4,5,3,1,2,6]。
具体地,我们这样描述该算法,对于长度为 n n n 的排列 a a a:
-
首先从后向前查找第一个顺序对 ( i , i + 1 ) (i,i+1) (i,i+1),满足 a [ i ] < a [ i + 1 ] a[i]<a[i+1] a[i]<a[i+1]。这样「较小数」即为 a [ i ] a[i] a[i]。此时 [ i + 1 , n ) [i+1,n) [i+1,n) 必然是下降序列。
-
如果找到了顺序对,那么在区间 [ i + 1 , n ) [i+1,n) [i+1,n) 中从后向前查找第一个元素 j j j 满足 a [ i ] < a [ j ] a[i]<a[j] a[i]<a[j]。这样「较大数」即为 a [ j ] a[j] a[j],且显然 a [ j − 1 ] ≥ a [ j ] > a [ i ] ≥ a [ j + 1 ] a[j-1]\geq a[j]>a[i]\geq a[j+1] a[j−1]≥a[j]>a[i]≥a[j+1],这保证了「较大数」向前交换后,右边的序列仍旧是以降序排列的。
-
交换 a [ i ] a[i] a[i] 与 a [ j ] a[j] a[j],此时区间 [ i + 1 , n ) [i+1,n) [i+1,n) 仍为降序。我们可以直接使用双指针反转区间 [ i + 1 , n ) [i+1,n) [i+1,n) 使其变为升序,而无需对该区间进行排序。
该算法在最坏情况下,找到「较小数」需要经过给定序列长度 N N N 的次数的比较,以及进行的反转操作也是 N N N 量级的计算复杂度,因此总的时间渐进复杂度为 O ( N ) O(N) O(N);而空间复杂度为仅存放待交换整数的索引位置,复杂度为 O ( 1 ) O(1) O(1)。
class Solution:def nextPermutation(self, nums: List[int]) -> None:i = len(nums) - 2while i >= 0 and nums[i] >= nums[i + 1]:i -= 1if i >= 0:j = len(nums) - 1while j >= 0 and nums[i] >= nums[j]:j -= 1nums[i], nums[j] = nums[j], nums[i]left, right = i + 1, len(nums) - 1while left < right:nums[left], nums[right] = nums[right], nums[left]left += 1right -= 1
执行用时:29 ms
消耗内存:16.40 MB
题解来源:力扣官方题解
相关文章:
LeetCode_31_中等_下一个排列
文章目录 1. 题目2. 思路及代码实现详解(Python)2.1 两遍扫描 1. 题目 整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。 例如, a r r [ 1 , 2 , 3 ] arr [1,2,3] arr[1,2,3] ,以下这些都可以视作 a r r arr arr…...
huggingface的transformers训练gpt
目录 1.原理 2.安装 3.运行 编辑 4.数据集 编辑 4.代码 4.1 model init编辑 forward: 总结: 关于loss和因果语言模型: 编辑 交叉熵:编辑 记录一下transformers库训练gpt的过程。 transformers/examples/…...
第六十一回 放冷箭燕青救主 劫法场石秀跳楼-编译安装飞桨paddlepaddle@openKylin+RISCV
卢俊义在水里被张顺抓住,用轿子抬到了梁山。宋江等人下马跪在地上迎接,请他坐第一把交椅。卢俊义宁死不从,大家只好说留他在山寨几天,先让李固带着马车货物回去。吴用对李固说,你的主人已经答应坐第二把交椅了…...
白话讲人工智能、机器学习、深度学习
人工智能(Artificial Intelligence,AI) 定义: 想象一个聪明的机器人,它能思考、决策和学习,就像电影里的智能角色那样。人工智能就是努力打造这样的智能实体的学科,它试图模仿、扩展乃至超越人…...
ssm项目(tomcat项目),定时任务(每天运行一次)相同时间多次重复运行job 的bug
目录标题 一、原因 一、原因 debug本地调试没有出现定时任务多次运行的bug,上传到服务器就出现多次运行的bug。(war的方式部署到tomcat) 一开始我以为是代码原因,或者是linux和win环境不同运行定时任务的方式不一样。 但是自己…...
vue3 + ts +element-plus + vue-router + scss + axios搭建项目
本地环境: node版本:20.10.0 目录 一、搭建环境 二、创建项目 三、修改页面 四、封装路由vue-router 五、element-plus 六、安装scss 七、封装axios 一、搭建环境 1、安装vue脚手架 npm i -g vue/cli 2、查看脚手架版本 vue -V3、切换路径到需…...
二叉树试题解析
一、单项选择题 01.下列关于二叉树的说法中,正确的是( C ). A.度为2的有序树就是二叉树 B.含有n个结点的二叉树的高度为 C.在完全二叉树中,若一个结点没有左孩子,则它必是叶结点 D.含有n个结点的完全二叉树的高度为解析:A 二叉树…...
计算机服务器中了faust勒索病毒怎么办,faust勒索病毒解密工具流程
网络是一把利剑,可以方便企业开展各项工作业务,为企业提供极大的便利,但随着网络技术的不断发展与应用,网络数据安全威胁也在不断增加,给企业的正常生产运营带来了极大困扰,近日,云天数据恢复中…...
初次部署麒麟V10系统需要的配置,快速完成测试环境的搭建
配置麒麟V10 设置“root”登录密码 sudo su -passwd # 设置登录密码允许“root”远程登录 sudo vim /etc/ssh/sshd_configsshd_config # ↓↓↓↓修改的内容↓↓↓↓ PermitRootLogin yes # ↑↑↑↑修改的内容↑↑↑↑重启服务 sudo systemctl restart sshd允许通过图像界…...
DOcker in Docker 原理与实战代码详解
Docker in Docker(DinD)指的是在Docker容器内部运行另一个Docker守护进程和客户端。这种技术可以用于创建嵌套的Docker环境,例如在持续集成/持续部署(CI/CD)管道中构建和测试Docker镜像。然而,需要注意的是…...
公司系统中了.rmallox勒索病毒如何恢复数据?
早晨上班时刻: 当阳光逐渐洒满大地,城市的喧嚣开始涌动,某公司的员工们纷纷踏入办公大楼,准备开始新的一天的工作。他们像往常一样打开电脑,准备接收邮件、查看日程、浏览项目进展。 病毒悄然发作: 就在员…...
论文阅读:Forget-Me-Not: Learning to Forget in Text-to-Image Diffusion Models
Forget-Me-Not: Learning to Forget in Text-to-Image Diffusion Models 论文链接 代码链接 这篇文章提出了Forget-Me-Not (FMN),用来消除文生图扩散模型中的特定内容。FMN的流程图如下: 可以看到,FMN的损失函数是最小化要消除的概念对应的…...
html5cssjs代码 036 CSS默认值
html5&css&js代码 036 CSS默认值 一、代码二、解释 CSS默认值(也称为浏览器默认样式)是指当HTML元素没有应用任何外部CSS样式时,浏览器自动为这些元素赋予的一组基本样式。这些样式是由浏览器的默认样式表(User Agent sty…...
小米路由器4A千兆版刷回官方固件
原文链接:小米路由器4A千兆版刷回官方固件及修改SN绑定APP-小米无线路由器及小米网络设备-恩山无线论坛 (right.com.cn) 进入breed 由于openwrt工作不稳定,决定重新刷回官方固件。 由于当前路由器已经刷过breed,不再重新刷入。 如何刷入b…...
【Leetcode每日一题】 递归 - 两两交换链表中的节点(难度⭐)(38)
1. 题目解析 题目链接:24. 两两交换链表中的节点 这个问题的理解其实相当简单,只需看一下示例,基本就能明白其含义了。 2.算法原理 一、理解递归函数的含义 首先,我们需要明确递归函数的任务:给定一个链表…...
如何部署GPT模型至自有服务器:从零开始搭建你的智能聊天机器人
引言 GPT模型是自然语言处理领域的重要突破,它能够通过生成式的文本生成方式,实现与用户的智能交互。本文将详细介绍如何将GPT模型部署到自有服务器上,并编写一个基本的API接口来实现与聊天机器人的交互。 目录 引言 一、准备工作 首先&am…...
uniapp 之 一些常用方法的封装(页面跳转,页面传参等)
util.js 提示:permission.js是uniapp插件市场由官方DCloud_heavensoft提供的App权限判断和提示插件。 import permision from "/js_sdk/wa-permission/permission.js"/*** uni.toast 封装* param {String} msg toast 提示内容* param {Number} duration …...
flutter 单列选择器
引入 flutter_pickers: ^2.1.9 import package:flutter_pickers/pickers.dart; import package:flutter_pickers/style/default_style.dart; import package:flutter_pickers/style/picker_style.dart;List<String> _numberList [99,98,97,96,95,94,93,92,91,90,89,88,…...
管理类联考–复试–英文面试–问题–WhatWhyHow--纯英文汇总版
文章目录 Do you have any hobbies? What are you interested in? What do you usually do in your spare time? Could you tell me something about your family? Could you briefly introduce your family? What is your hometown like? Please tell me so…...
亮数据代理IP轻松解决爬虫数据采集痛点
文章目录 一、爬虫数据采集痛点二、为什么使用代理IP可以解决?2.1 爬虫和代理IP的关系2.2 使用代理IP的好处 一、爬虫数据采集痛点 爬虫数据采集可能会面临一些挑战和痛点,其中包括: 爬虫代码维护难:网站的结构可能会经常变化&am…...
从原理到实战:深入解析PI控制器如何消除稳态误差与应对积分饱和
1. 当温度总差那么一点点:PI控制器如何消灭稳态误差 去年调试反应釜温度控制系统时,遇到个头疼的问题:设定150℃保温,实际温度永远停在148.2℃。就像洗澡时混水阀总差最后一格,这种微小但顽固的偏差就是典型的稳态误差…...
Gitee本土化战略深度解析:中国开发者生态的“新基建“ Gitee本土化战略深度解析:中国开发者生态的“新基建“
在数字化转型浪潮席卷全球的当下,代码托管平台作为软件开发的基础设施,其战略价值日益凸显。Gitee作为中国本土领先的代码托管平台,凭借其独特的本土化优势,正在重塑国内开发者的协作生态。与GitHub等国际平台相比,Git…...
算法岗面试指南:深度学习核心问题一网打尽
算法岗面试指南:深度学习核心问题一网打尽 本文详细解析了算法岗面试指南:深度学习核心问题一网打尽,内容如下: params_grad evaluate_gradient(loss_function, data, params) params params - learning_rate * params_grad优点…...
别再为动态抓取发愁了!手把手教你搞定机械臂与传送带的‘异地恋’手眼标定
机械臂与传送带动态抓取:非重合视野下的高精度手眼标定实战指南 在工业自动化领域,机械臂与传送带的协同作业已成为现代生产线上的标配。然而,当相机视野与机械臂工作范围分离时,如何建立可靠的坐标转换关系成为困扰工程师的技术痛…...
Windows系统下MacBook Pro Touch Bar高效解锁指南:一键开启智能触控显示功能
Windows系统下MacBook Pro Touch Bar高效解锁指南:一键开启智能触控显示功能 【免费下载链接】DFRDisplayKm Windows infrastructure support for Apple DFR (Touch Bar) 项目地址: https://gitcode.com/gh_mirrors/df/DFRDisplayKm 还在为Windows系统下MacB…...
专业干货!AI教材写作技巧,让你的教材低查重又优质
梳理教材的知识点真的是一项“精细工作”,最大的挑战在于如何保持平衡与衔接!我们常常会担心遗漏重要的核心知识点,或者难以把握好难度的层次——小学的教材写得过于深奥,学生看不明白;而高中教材又显得过于简单&#…...
【JavaScript高级编程】拆解函数流水线 上加
一、什么是setuptools? setuptools 是一个用于创建、分发和安装 Python 包的核心库。 它可以帮助你: 定义 Python 包的元数据(如名称、版本、作者等)。 声明包的依赖项,确保你的包能够正确运行。 构建源代码分发包&…...
FLUX.1文生图案例集:看SDXL Prompt Styler如何助力生成高质量、风格一致的图片
FLUX.1文生图案例集:看SDXL Prompt Styler如何助力生成高质量、风格一致的图片 你是否曾经尝试用AI生成图片,却发现即使输入了详细的描述,最终效果却与预期相差甚远?或者明明想要统一的风格系列图,却每次生成都风格迥…...
保姆级教程:用PPOCRLabel标注你的专属数据集,5分钟搞定PaddleOCR训练数据准备
5分钟极速标注:用PPOCRLabel打造高精度PaddleOCR私有数据集 当你面对一叠合同扫描件或成堆的产品说明书照片时,是否曾被手动标注文字区域的繁琐过程劝退?传统OCR数据准备往往需要耗费数小时绘制检测框、核对文本内容,而今天我要分…...
LDDC:重新定义歌词管理的12项技术创新与开源解决方案
LDDC:重新定义歌词管理的12项技术创新与开源解决方案 【免费下载链接】LDDC 简单易用的精准歌词(逐字歌词/卡拉OK歌词)下载匹配工具|A simple and user-friendly tool for downloading and matching precise lyrics (word-by-word lyrics/Karaoke lyrics) 项目地址…...
