《leetcode-go》返回第k个排列

该博客讨论了如何通过阶乘计算和字典序排列来确定集合中第k个排列的方法。以n=3为例,展示了从'123'到'321'的所有排列,并解释了如何根据k值找到对应的排列。提供的代码实现了一个函数`getPermutation`,它接受n和k作为输入,返回第k个排列。这个函数首先构建一个阶乘数组,然后通过迭代和取余运算找出每个位置上的数字。

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

集合[1,2,3,…,n]一共有n!种不同的排列

按字典序列出所有的排列并且给这些排列标上序号

我们就会得到以下的序列(以n=3为例)

  1. "123"
  2. "132"
  3. "213"
  4. "231"
  5. "312"
  6. "321"

现在给出n和k,请返回第k个排列

注意:n在1到9之间

思路:每一位都是有顺序的,第k个排列,那么就是k/(n-1)的阶乘,然后 商 或 商+1 (取决于有没有余数,有余数就+1)就是第几个数字,然后 余数 或者 (n-1)的阶乘 继续循环求结果。

package main

import "strconv"
/**
  * 
  * @param n int整型 
  * @param k int整型 
  * @return string字符串
*/
func getPermutation( n int ,  k int ) string {
    // write code here
    multiList := make([]int, n)
	multiMap := make(map[int]int)
	multiList[0] = 1
	multiMap[1] = 1
	for i := 2; i <= n; i++ {
		multiList[i-1] = i * multiList[i-2]
		multiMap[i] = 1
	}
	retStr := ""
	for i := n; i > 1; i-- {
		num := k / multiList[i-2]
		k = k % multiList[i-2]
		if k != 0 {
			num++
		} else {
			k = multiList[i-2]
		}
		var j = 1
		for j = 1; j <= n; j++ {
			if multiMap[j] == 1 {
				num--
			}
			if num == 0 {
				break
			}
		}
		multiMap[j] = 0
		retStr += strconv.Itoa(j)
	}
	for j := 1; j <= n; j++ {
		if multiMap[j] == 1 {
			retStr += strconv.Itoa(j)
		}
	}
	return retStr
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值