📑 题目:60. 排列序列

🚀 本题 LeetCode 传送门

题目大意

给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列。

按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下:“123”,“132”,“213”,“231”,“312”,“321”,给定 n 和 k,返回第 k 个排列。

解题思路

  • 用 DFS 暴力枚举,这种做法时间复杂度特别高,想想更优的解法。

代码

  1. package leetcode
  2. import (
  3. ""fmt""
  4. ""strconv""
  5. )
  6. func getPermutation(n int, k int) string {
  7. if k == 0 {
  8. return """"
  9. }
  10. used, p, res := make([]bool, n), []int{}, """"
  11. findPermutation(n, 0, &k, p, &res, &used)
  12. return res
  13. }
  14. func findPermutation(n, index int, k *int, p []int, res *string, used *[]bool) {
  15. fmt.Printf(""n = %v index = %v k = %v p = %v res = %v user = %v
  16. "", n, index, *k, p, *res, *used)
  17. if index == n {
  18. *k--
  19. if *k == 0 {
  20. for _, v := range p {
  21. *res += strconv.Itoa(v + 1)
  22. }
  23. }
  24. return
  25. }
  26. for i := 0; i < n; i++ {
  27. if !(*used)[i] {
  28. (*used)[i] = true
  29. p = append(p, i)
  30. findPermutation(n, index+1, k, p, res, used)
  31. p = p[:len(p)-1]
  32. (*used)[i] = false
  33. }
  34. }
  35. return
  36. }