当前位置:网站首页>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
边栏推荐
- WeChat applet, global variables change in one place and the state in other places also changes.
- 3款不同类型的自媒体免费工具,有效提高创作、运营效率
- 石墨文档打开文档时快速定位到上次写的位置
- Will SQL and NoSQL eventually converge?
- 【勇敢饭饭,不怕刷题之链表】链表反转的几种情况
- [Brave food, not afraid to write the linked list] The problem of the penultimate node of the linked list
- 建校仅11年就入选“双一流” ,这所高校是凭什么做到的?
- 【勇敢饭饭,不怕刷题之链表】链表中有环的问题
- Intel pushes 20220809 CPU microcode update to patch Intel-SA-00657 security vulnerability
- 一文带你搞懂中断按键驱动程序之poll机制
猜你喜欢
ViT结构详解(附pytorch代码)
自媒体爆款标题怎么写?手把手教你写热门标题
LAXCUS分布式操作系统安全管理
mysql appears: ERROR 1524 (HY000): Plugin '123' is not loaded
Intel pushes 20220809 CPU microcode update to patch Intel-SA-00657 security vulnerability
态路小课堂丨如何为CXP光模块选择光纤跳线?
VSCode远程连接服务器报错:Could not establish connection to “xxxxxx”的可能错误原因及解决
第2章-矩阵及其运算-矩阵创建(1)
How to join We Media, learn about these 5 monetization modes, and make your account quickly monetize
ISO9001在讲什么?过程方法和风险思维
随机推荐
【勇敢饭饭,不怕刷题之链表】有序链表的合并
不止跑路,拯救误操作rm -rf /*的小伙儿
杭电多校-Loop-(不确定性贪心+线段树)
rider内Mono脚本找不到引用资源
Clicking Exercise - 64 Longest Harmonic Subsequences
Spss-多元回归案例实操
HCIP ---- VLAN
Article take you understand interrupt the key driver of polling mechanism
【勇敢饭饭,不怕刷题之链表】链表反转的几种情况
Licking Exercise - 63 Find all anagrams in a string
从源码角度分析UUID的实现原理
Nocalhost - Making development more efficient in the cloud-native era
从脚本到剪辑,影像大师亲授的后期制作秘籍
A little self-deprecating deconstruction about farmers "code"
力扣练习——62 有效的数独
Do self-media monthly income tens of thousands?Several self-media tools that bloggers are using
基于UiAutomator2+PageObject模式开展APP自动化测试实战
今天面了个腾讯拿38K出来的大佬,让我见识到了基础的天花板
HDU 1520 Anniversary party (tree dp)
不止跑路,拯救误操作rm -rf /*的小伙儿