60. 第k个排列

本文深入探讨了使用Golang实现的一种高效的排列组合算法,详细解释了如何通过递归调用和位操作来生成特定顺序的排列,同时提供了完整的代码示例和复杂度分析。

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

链接

题目.

难度:

middle

解答:

思路一开始就是对了的,就是确定每一个位置上应该怎样取值,但是有一点没注意,当剩余的k <= subCnt的时候应该交由下一步来处理

package main

import "fmt"

func helper(permu, permuCnts []int, k int) {
	//fmt.Println(permu, permuCnts, k)

	if k == permuCnts[0] {
		for i, j := 0, len(permu)-1; i < j; i, j = i+1, j-1 {
			permu[i], permu[j] = permu[j], permu[i]
		}
		return
	}

	subCnt := permuCnts[1]
	if k <= subCnt {
		helper(permu[1:], permuCnts[1:], k)
		return
	}

	for i := 1; i < len(permu); i++ {
		if (k - subCnt*i) <= subCnt {
			tmp := permu[i]
			for j := i - 1; j >= 1; j-- {
				permu[j+1] = permu[j]
			}
			permu[0], permu[1] = tmp, permu[0]
			helper(permu[1:], permuCnts[1:], k-subCnt*i)
			return
		}
	}
}

func getPermutation(n int, k int) string {
	permu := make([]int, n)
	for i := 0; i < n; i++ {
		permu[i] = i + 1
	}

	permuCnts := make([]int, n)
	permuCnts[n-1] = 1
	for i, j := n-2, 2; i >= 0; i, j = i-1, j+1 {
		permuCnts[i] = j * permuCnts[i+1]
	}

	if k > permuCnts[0] {
		panic("k too large")
	}

	helper(permu, permuCnts, k)

	result := make([]byte, n)
	for i := 0; i < n; i++ {
		result[i] = byte(permu[i]) + '0'
	}
	return string(result)
}

func main() {
	fmt.Println(getPermutation(3, 4))
}

复杂度分析

time

O(n)

space

O(1)

执行结果

执行用时 :
0 ms
, 在所有 golang 提交中击败了
100.00%
的用户
内存消耗 :
2 MB
, 在所有 golang 提交中击败了
64.86%
的用户

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值