当前位置:网站首页>LeetCode50天刷题计划(Day 17—— 下一个序列(14.50-16.30)
LeetCode50天刷题计划(Day 17—— 下一个序列(14.50-16.30)
2022-08-10 11:01:00 【国际知名观众】
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
坚持下去!!就是力所能及的伟大的事!
一、题目
下一个排列
整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。
例如,arr = [1,2,3] ,以下这些都可以视作 arr 的排列:[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1] 。
整数数组的 下一个排列 是指其整数的下一个字典序更大的排列。更正式地,如果数组的所有排列根据其字典顺序从小到大排列在一个容器中,那么数组的 下一个排列 就是在这个有序容器中排在它后面的那个排列。如果不存在下一个更大的排列,那么这个数组必须重排为字典序最小的排列(即,其元素按升序排列)。
例如,arr = [1,2,3] 的下一个排列是 [1,3,2] 。
类似地,arr = [2,3,1] 的下一个排列是 [3,1,2] 。
而 arr = [3,2,1] 的下一个排列是 [1,2,3] ,因为 [3,2,1] 不存在一个字典序更大的排列。
给你一个整数数组 nums ,找出 nums 的下一个排列。
必须 原地 修改,只允许使用额外常数空间。
示例
示例 1:
输入:nums = [1,2,3]
输出:[1,3,2]
示例 2:
输入:nums = [3,2,1]
输出:[1,2,3]
示例 3:
输入:nums = [1,1,5]
输出:[1,5,1]
提示
1 <= nums.length <= 100
0 <= nums[i] <= 100
二、思路
1.初印象
本题数据规模并不大,所以首先考虑按顺序形成所有序列(深搜或递归),当找到题中所给序列时,将其下一个输出。
但是这种方式必然无达成原地修改,至少需要O(n)空间存储当前形成的序列。
因此考虑能不能有一个规则,就在现有数字的基础上交换顺序就得到下一个排列。
2.找规律
以下面这个图([1,2,3,4])为例观察规律:(画的比较丑凑合看吧^-^)

根据上图,我们可以发现以下规律:
①对于涉及后两位:后两位是字典序(即黄色部分)的情况。只需要交换后两位就可以得到下一个排序
②对于涉及后三位:后两位是非字典序,但后三位又不是完全的倒序(即非黄非蓝部分)的情况。则从序列的最后一个元素向前遍历,找到第一个大于倒数第三位的元素,将其与倒数第三位交换,倒数第一位和第二位应是字典序。
③对于涉及后四位:(蓝色部分)从后寻找比倒数第四位元素大的第一个元素,将其与倒数第四位元素交换,后三位元素应是字典序。
…
3.普遍算法
我们可以寻找更加普遍的规律,对于一个序列:
(1)指针i指向倒数第二个元素,指针j从序列末位元素向前寻找i后第一个比i指向元素大的元素,将他与i交换。如果找不到这个元素(即指针后的元素都比指针小),i指针向前移动一位,再次寻找。(此处可以优化,比如i指针新元素比上一个元素还大,那不用比了直接移动即可)
(2)当指针移动到首元素之前,说明比对失败了,此序列是字典序最大的序列,此时应返回字典序最小的序列。
(3)如果成功找到,此时可以证明交换后,被交换的元素(即i指针的位置后)后的所有元素都是降序排列的(因为之前遍历的时候就是找后面比前面大的元素,既然没找到那就一定是后面比前面小)。由于我们需要i后元素都是字典序,所以要将他们反序。
三、代码
class Solution:
def nextPermutation(self, nums: List[int]) -> None:
""" Do not return anything, modify nums in-place instead. """
n=len(nums) #长度
flag=0 #是否成功交换
for i in range(n-2,-2,-1): #遍历
if(i==-1 or flag==1): #i==-1说明没找到,全体倒序
nums[:]=nums[::-1] #倒序
break
if(i<n-2 and nums[i]>nums[i+1]): #优化,下一轮
continue
for j in range(n-1,i,-1):
if(nums[j]>nums[i]): #如果找到
nums[i],nums[j]=nums[j],nums[i] #交换
flag=1
break
if(flag==1): #找到了,倒序
nums[i+1:]=nums[:i:-1] #倒序
break

边栏推荐
- From the product dimension, why can't we fully trust Layer2?
- 如何使用工程仪器设备在线监测管理系统
- [Brave food, not afraid of the linked list of brushing questions] Merging of ordered linked lists
- ISO9001在讲什么?过程方法和风险思维
- 英特尔推送20220809 CPU微码更新 修补Intel-SA-00657安全漏洞
- Pulling drills - 56 Finding the right interval
- Kyligence 通过 SOC 2 Type II 审计,以可信赖的企业级产品服务全球客户
- 力扣练习——64 最长和谐子序列
- The impact of development mode on testing
- HDU 1520 Anniversary party (树型dp)
猜你喜欢

Article take you understand interrupt the key driver of polling mechanism

Intel pushes 20220809 CPU microcode update to patch Intel-SA-00657 security vulnerability

【勇敢饭饭,不怕刷题之链表】链表中有环的问题

第3章-线性方程组(3)

Open Office XML 格式里如何描述多段具有不同字体设置的段落

英特尔推送20220809 CPU微码更新 修补Intel-SA-00657安全漏洞

Some tips for using Unsafe

MLX90640 红外热成像仪测温传感器 手机 APP 软件 RedEye 连接详细

Pycharm终端出现PS问题、conda或activate不是内部命令问题..
![[Go WebSocket] 多房间的聊天室(一)思考篇](/img/c9/4374a57c6a4ae02f606253a4c299e4.png)
[Go WebSocket] 多房间的聊天室(一)思考篇
随机推荐
从产品维度来看 我们为什么不能完全信任Layer2?
Licking Exercise - 60 Maximum key-value sum of binary search subtrees
Intel pushes 20220809 CPU microcode update to patch Intel-SA-00657 security vulnerability
leetcode 823. Binary Trees With Factors(因子二叉树)
老板加薪!看我做的WPF Loading!!!
2022年裁员潮,失业程序员何去何从?
振弦传感器及核心VM系列振弦采集模块
LeetCode_628_三个数的最大乘积
建校仅11年就入选“双一流” ,这所高校是凭什么做到的?
HDU 1520 Anniversary party (树型dp)
软件架构简介
The impact of development mode on testing
Nocalhost - 让云原生时代的开发更高效
Where can I view the version record of WeChat applet submission review history?
Buckle Exercise - 61 Sort by frequency of characters
Do self-media monthly income tens of thousands?Several self-media tools that bloggers are using
一文带你搞懂中断按键驱动程序之poll机制
Short video software development - how to break the platform homogenization
Nocalhost - Making development more efficient in the cloud-native era
Centos7 environment uses Mysql offline installation package to install Mysql5.7