LeetCode 60 排列序列

原文地址:https://leileiluoluo.com/posts/leetcode-permutation-sequence.html

1 题目描述
我们知道集合[1,2,3,...,n]共包含n!个排列。以n=3为例,其有序全排列如下。
"123"
"132"
"213"
"231"
"312"
"321"
本题给定n,求其有序全排列中的第k个。
注:n介于区间[1,9],k介于区间[1,n!]。

例子1:
输入:n = 3, k = 3
输出:"213"

例子2:
输入:n = 4, k = 9
输出:"2314"

题目出处:
https://leetcode.com/problems/permutation-sequence/

2 解决思路
首先根据k找到需要计算的最小子序列,假定找到的该子序列的长度为i,针对该序列分别将第[0,i-1]个元素至于头部的序列共有i*(i-1)!个全排列。所以根据该规律,对于给定的k,即可计算出第几个元素需至于头部,然后将k重置为余数,再对其子序列递归计算结果。

3 golang实现代码
https://github.com/olzhy/leetcode/blob/master/60_Permutation_Sequence/test.go

func factorial(i int) int {  
    f := 1  
    for ; i >= 1; i-- {  
        f *= i  
    }  
    return f  
}  
  
func getPermutaion(s string, k int) string {  
    i := len(s)  
    if 1 == i {  
        return s  
    }  
    factorial := factorial(i)  
    nextFactorial := factorial / i  
    if k <= nextFactorial {  
        return s[:1] + getPermutaion(s[1:], k)  
    }  
    c, k := (k-1)/nextFactorial, (k-1)%nextFactorial+1  
    if c > 0 {  
        s = string(s[c]) + s[:c] + s[c+1:]  
    }  
    return getPermutaion(s, k)  
}  
  
func getPermutation(n int, k int) string {  
    s := ""  
    for i := 1; i <= n; i++ {  
        s += strconv.Itoa(i)  
    }  
    return getPermutaion(s, k)  
}  

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值