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

解决Leetcode第3470题全排列IV

3470.全排列IV

难度:困难

问题描述:

给你两个整数n和k,一个交替排列是前n个正整数的排列,且任意相邻两个元素不都为奇数或都为偶数。

返回第k个交替排列,并按字典序排序。如果有效的交替排列少于k个,则返回一个空列表。

示例1

输入:n=4,k=6

输出:[3,4,1,2]

解释:

[1,2,3,4]的交替排列按字典序排序后为:

[1,2,3,4]

[1,4,3,2]

[2,1,4,3]

[2,3,4,1]

[3,2,1,4]

[3,4,1,2]←第6个排列

[4,1,2,3]

[4,3,2,1]

由于k=6,我们返回[3,4,1,2]。

示例2

输入:n=3,k=2

输出:[3,2,1]

解释:

[1,2,3]的交替排列按字典序排序后为:

[1,2,3]

[3,2,1]←第2个排列

由于k=2,我们返回[3,2,1]。

示例3

输入:n=2,k=3

输出:[]

解释:

[1,2]的交替排列按字典序排序后为:

[1,2]

[2,1]

只有2个交替排列,但k=3超出了范围。因此,我们返回一个空列表[]。

提示:

1<=n<=100

1<=k<=1015

分析问题:

这个问题关键是要先把1至n共n个数的全排列找出来,然后根据“任意相邻两个元素不都为奇数或都为偶数”的规则生成交替排列,并按字典序排好序,剩下的输出第k个排列就好办了。生成全排列又用到了递归的方法。

程序如下:

#将一个整数插入到一个整数列表中的各个位置,形成一个新的全排列并返回
def one_into_all(a,b):
    n=len(b)
    c=[]
    for i in range(n+1):
        left=b[:i]
        right=b[i:]
        d=left+[a]+right
        c.append(d)
    return c

#生成列表a的全排列,并返回
def all_array(a):
    n=len(a)
    if n==2:
        return[[a[0],a[1]],[a[1],a[0]]]
    elif n==3:
        return [[a[0],a[1],a[2]],[a[0],a[2],a[1]],[a[1],a[0],a[2]],[a[1],a[2],a[0]],[a[2],a[0],a[1]],[a[2],a[1],a[0]]]
    else:
        c=[]
        b=a[0]
        for i in all_array(a[1:]):
            d=one_into_all(b,i)
            c.extend(d)
        c.sort()
        return c

#检查一个列表中相邻两个整数是否都为奇数或都为偶数,如果是返回True,否则返回False
def is_odd_or_even(a):
    n=len(a)
    for i in range(n-1):
        if a[i]%2==0 and a[i+1]%2==0 or a[i]%2==1 and a[i+1]%2==1:
            return True
    else:
        return False

#主程序之输入部分
n=int(input('pls input n='))
k=int(input('pls input k='))
#根据输入的n值,生成元素为1至n的列表
a=list(range(1,n+1))

#从1至n的全排列中去除相邻元素都为奇数或都为偶数的排列,生成交替排列
b=[]
for i in all_array(a):
    if is_odd_or_even(i):
        continue
    else:
        b.append(i)

#根据k的值,输出第k个排列或输出空列表
n=len(b)
if k<=n:
    print(f'生成的交替排列中的第{k}个排列为:{b[k-1]}')
else:
    print([])

#将交替排列按一行四个排列的格式输出
k=0
print('生成的交替排列按每行4个元素排列如下:',end=' ')
for i in b:
    if k%4!=0:
        print(i,end=' ')
    else:
        print()
        print(i,end=' ')
    k=k+1

运行实例一

pls input n=4

pls input k=3

生成的交替排列中的第3个排列为:[2, 1, 4, 3]

生成的交替排列按每行4个元素排列如下:

[1, 2, 3, 4] [1, 4, 3, 2] [2, 1, 4, 3] [2, 3, 4, 1]

[3, 2, 1, 4] [3, 4, 1, 2] [4, 1, 2, 3] [4, 3, 2, 1]

运行实例二

pls input n=3

pls input k=2

生成的交替排列中的第2个排列为:[3, 2, 1]

生成的交替排列按每行4个元素排列如下:

[1, 2, 3] [3, 2, 1]

运行实例三

pls input n=2

pls input k=3

生成的交替排列中没有第3个排列,故输出[]

生成的交替排列按每行4个元素排列如下:

[1, 2] [2, 1]

全排列是解决很多问题的关键,探究生成全排列的各种方法应该是必要的。

相关文章:

  • Ubuntu20.04本地配置IsaacLab 4.2.0的G1训练环境(二):训练与推理
  • ubuntu 工具操作记录(vim)
  • springboot429-基于springboot的教务管理系统(源码+数据库+纯前后端分离+部署讲解等)
  • PCB设计相关笔记
  • java八股文之消息中间件
  • docker-compose Install reranker(fastgpt支持) GPU模式
  • Linux - 进程信号
  • MetaGPT发布的MGX与Devin深度对比
  • DeepSeek私有化部署6:openEuler 24.03-LTS-SP1安装Open WebUI
  • 大模型应用开发学习笔记
  • 基于国产芯片的AI引擎技术,打造更安全的算力生态 | 京东零售技术实践
  • 3.2、对称加密算法
  • 实现单点登录的几种方式
  • 哈希查找与深度优先遍历深度解析
  • Qt 进度条与多线程应用、基于 Qt 的文件复制工具开发
  • 使用Kingfisher加载网络图片时使用indicatorType产生布局混乱
  • esp32s3聊天机器人(二)
  • 使用STM32CubeMX实现LED灯每秒闪烁一次(STM32G070CBT6单片机)
  • 深入理解 HTML 元素:构建网页的基础
  • 贪心算法二
  • 郑州装修公司排名推荐/seo关键词优化推广哪家好
  • 涿州做网站建设/seo免费优化软件
  • 怎让做淘宝网站/seo外链技巧
  • 个人网站设计图/百度搜索量统计
  • 网站界面(UI)设计/小程序开发教程
  • 网站不用域名需要备案吗/注册网站多少钱