刷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] 移动到比自己小的数后面才能使得移动中的序列正向目标前进。
因此只要求出每个数的移动次数,然后相加就是该