字典序和下一个排列

博客详细介绍了字典序的概念,包括字典序排列、字典序值的计算方法,并给出了如何找到一个序列的下一个字典序排列的步骤。通过实例解析了字典序值的计算过程和下一个序列的求解思路,最后提供了C++实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

刷Leetcode 的时候遇到字典序求下一个序列的问题,字典序是一种手写起来很简单但是描述起来比较费劲的序列,之前了解的也不多,所以就是...不会做!看题解的时候看给的图片仍然没搞懂什么意思,不过还好在图片的下边附了个动图。看动图一下就看明白了解法,但是还是不明白为什么要这么解。又去网上搜其他的博客,结果除了下一个序列之外,又搜到一篇字典序值(当前序列在字典序中的位置)的解法。那篇博客的思想是没啥问题,只是描述地有些晦涩难懂,重点不突出,所以花了挺长时间才搞懂。这里简单整理一下,让不明白字典序原理的人可以在最短的时间内学会求解字典序值和下一个序列。

1. 字典序

先来看一下[1, 2, 3] 的字典序排列:

字典序值 0 1 2 3 4 5
排列 123 132 213 231 312 321

 

简单来讲,字典序就是保持左边不变(变得最慢),右边依次从正序到逆序的排列过程。就像我们做两位数的加法,我们从10 加到20 的过程中,中间每加一个值只改变个位数的大小,直到量变达到质变的时候才会去将十位数的数字从1 变成2,大概可以这么理解。

2. 字典序值

字典序值就是当前序列在字典序中的排列位置。那给定一个排列,我们应该如何求出它的字典序值呢?

为了求排列对应的序号,只要该序列到第一个序列即1,2,3…n 所需要移动的次数。

移动原则是a[i] 从大到小移动,对于每一个数字a[i],若i前面比a[i] 小的个数正好是a[i] - 1 个,则这个数不需要向后移动以达到目标序列,否则i 后面必然有a[i] - t - 1 (此处t 的值为a[i] 之前比a[i] 小的数字的个数)个比a[i] 小的数,只要把a[i] 移动到比自己小的数后面才能使得移动中的序列正向目标前进。

因此只要求出每个数的移动次数,然后相加就是该

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值