47.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. package main
  2. /* func nextPermutation(nums []int) {
  3. if len(nums) < 2 {
  4. return
  5. }
  6. // rfind first num descended 'ni'
  7. // 346987521 -> 34 '6' 987521
  8. i := len(nums) - 2
  9. for ; i >= 0 && nums[i] >= nums[i+1]; i-- {
  10. }
  11. if i != -1 {
  12. // find the last num 'nj' which is larger than 'ni'
  13. // swap 'nj', 'ni'
  14. // 34 '6' 987521 -> 34 '6' 98 '7' 521 -> 34 '7' 98 '6' 521
  15. j := i + 1
  16. for ; j+1 < len(nums) && nums[j+1] > nums[i]; j++ {
  17. }
  18. nums[i], nums[j] = nums[j], nums[i]
  19. }
  20. // reverse the sequence after pos 'i'
  21. // 34 '7' '986521' -> 34 '7' '125689'
  22. for l, r := i+1, len(nums)-1; l < r; l, r = l+1, r-1 {
  23. nums[l], nums[r] = nums[r], nums[l]
  24. }
  25. } */
  26. func isEqual(a, b []int) bool {
  27. for i, v := range b {
  28. if a[i] != v {
  29. return false
  30. }
  31. }
  32. return true
  33. }
  34. func permuteUnique(nums []int) [][]int {
  35. if len(nums) == 0 {
  36. return [][]int{}
  37. }
  38. res := [][]int{nums}
  39. last := make([]int, len(nums))
  40. copy(last, nums)
  41. for {
  42. solution := make([]int, len(last))
  43. copy(solution, last)
  44. nextPermutation(solution)
  45. if isEqual(nums, solution) {
  46. break
  47. }
  48. copy(last, solution)
  49. res = append(res, solution)
  50. }
  51. return res
  52. }
  53. /* func main() {
  54. a1 := []int{1, 1, 2, 3}
  55. fmt.Println(permuteUnique(a1))
  56. } */