当前位置: 首页 > news >正文

全排列 | 下一个排列

字典序更大

字典序更大是指在字典序排列中,一个排列比另一个排列更大。字典序排列是按照元素从左到右的顺序进行比较的,类似于字典中单词的排列顺序。

具体来说,对于两个排列 ( a = [ a 1 , a 2 , … , a n ] ) (a = [a_1, a_2, \ldots, a_n]) (a=[a1,a2,,an]) ( b = [ b 1 , b 2 , … , b n ] ) (b = [b_1, b_2, \ldots, b_n]) (b=[b1,b2,,bn]),我们从左到右逐个比较它们的元素:

  1. 如果存在某个位置 i 使得 ( a i > b i ) (a_i > b_i) (ai>bi),并且对于所有 ( j < i ) (j < i) (j<i),都有 ( a j = b j ) (a_j = b_j) (aj=bj),那么我们说排列 a a a 比排列 b b b 字典序更大。
  2. 如果所有位置的元素都相等,即 ( a i = b i ) (a_i = b_i) (ai=bi) 对于所有 i 都成立,那么我们说排列 a a a 和排列 b b b 相等。

所以,字典序更大意味着在字典序排列中,一个排列排在另一个排列的后面。在生成下一个排列时,我们需要找到字典序更大的下一个排列,即在所有排列的有序容器中排在当前排列后面的那个排列。如果不存在下一个更大的排列,那么这个数组必须重排为字典序最小的排列,即其元素按升序排列。

下一个排列

例子:

假设我们有一个排列 (a = [1, 3, 5, 4, 2])。

  1. 从右向左找到第一个升序对:(a[2] = 3) 和 (a[3] = 5) 是最后一个升序对,所以 (i = 2)。

  2. 在 (a[3] = 5, a[4] = 4, a[5] = 2) 中找到大于 (a[2] = 3) 的最小元素,是 (a[4] = 4),所以 (j = 4)。

  3. 交换 (a[2]) 和 (a[4]):得到排列 ([1, 4, 5, 3, 2])。

  4. 将 (a[3] = 5, a[4] = 3, a[5] = 2) 逆序:得到排列 ([1, 4, 2, 3, 5])。

所以,排列 ([1, 3, 5, 4, 2]) 的字典序下一个排列是 ([1, 4, 2, 3, 5])。

要生成一个排列的字典序下一个排列,我们可以按照以下步骤进行:

  1. 从右向左找到第一个升序对:找到排列中最后一个满足 (a[i] < a[i+1]) 的位置 (i)。如果这样的 (i) 不存在,说明排列已经是字典序最大的排列,下一个排列就是字典序最小的排列,即排列的逆序。

  2. 找到大于 (a[i]) 的最小元素:在 (a[i+1]) 到 (a[n-1]) 中找到大于 (a[i]) 的最小元素,假设其位置为 (j)。

  3. 交换 (a[i]) 和 (a[j]):将 (a[i]) 和 (a[j]) 交换。

  4. 将 (a[i+1]) 到 (a[n-1]) 逆序:将 (a[i+1]) 到 (a[n-1]) 的元素逆序,这样可以得到字典序最小的排列。

python实现

def nextP(index):
    global s, n  # 确保 s 和 n 在函数内部可用
    for _ in range(index):  
        if n <= 1:  # 如果排列长度小于等于1,直接返回
            return
        for i in range(n - 2, -1, -1):  # 从倒数第二个元素开始遍历
            if s[i] < s[i + 1]:  # 找到第一个非递减的位置
                for j in range(n - 1, i, -1):  # 从后往前找第一个比 s[i] 大的数
                    if s[j] > s[i]:
                        s[i], s[j] = s[j], s[i]  # 交换它们
                        s[i + 1:] = sorted(s[i + 1:])  # 让后面的部分变为升序
                        break
                break
        else:
            s.sort()  # 如果整个序列已经是最大排列,则直接变成最小排列

n = int(input().strip())  # n:表示序列的长度(即有多少个数)
index = int(input().strip())  # index:表示要执行 “求下一个排列” 的次数
s = list(map(int, input().split()))  # 读取数组

nextP(index)  
print(' '.join(map(str, s)))  # 输出最终排列

参考

https://blog.csdn.net/m0_54689021/article/details/125573187

相关文章:

  • CSS3学习教程,从入门到精通,CSS3 浮动与清除浮动语法知识点及案例代码(14)
  • 计算机二级:文件操作
  • C语言部分代码
  • 深入理解指针(2)(C语言版)
  • MySQL基本函数
  • UE4学习笔记 FPS游戏制作20 重写机器人和玩家死亡 切换相机和模型
  • 【leetcode hot 100 739】每日温度
  • 关系图:赋能数据可视化的动态扩展
  • 微服务中的服务发现与注册中心
  • python之网络编程
  • zabbix添加IIS网站计数器(并发连接数)
  • jupyter使用过程中遇到的问题
  • 硬件学习笔记--53 DC-DC Buck工作原理、选型及应用介绍
  • <KeepAlive>和<keep-alive>有什么区别
  • LiblibAI 接入阿里通义大模型,推出 10 秒 AI 视频生成功能
  • 汽车加气站操作工题目及答案解析
  • 算法学习第十六天:动态规划(补充题目)
  • PowerBI,用度量值实现表格销售统计(含合计)的简单示例
  • Win11 环境使用WSL安装Ubunut系统
  • python中神级调试工具pysnooper库的详细使用
  • 建设网站建设安全培训平台/网页开发需要学什么
  • 营销型网站管理系统/什么是竞价推广
  • 山东淄博网站建设/河北百度seo
  • 在洪雅网站做企业招聘/快速网站轻松排名
  • 张扬网站建设/网站建站在线制作
  • 深圳市门户网站建设企业/深圳竞价托管