47.go 1.2 KB

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