123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- package main
- /* func nextPermutation(nums []int) {
- if len(nums) < 2 {
- return
- }
- // rfind first num descended 'ni'
- // 346987521 -> 34 '6' 987521
- i := len(nums) - 2
- for ; i >= 0 && nums[i] >= nums[i+1]; i-- {
- }
- if i != -1 {
- // find the last num 'nj' which is larger than 'ni'
- // swap 'nj', 'ni'
- // 34 '6' 987521 -> 34 '6' 98 '7' 521 -> 34 '7' 98 '6' 521
- j := i + 1
- for ; j+1 < len(nums) && nums[j+1] > nums[i]; j++ {
- }
- nums[i], nums[j] = nums[j], nums[i]
- }
- // reverse the sequence after pos 'i'
- // 34 '7' '986521' -> 34 '7' '125689'
- for l, r := i+1, len(nums)-1; l < r; l, r = l+1, r-1 {
- nums[l], nums[r] = nums[r], nums[l]
- }
- } */
- func isEqual(a, b []int) bool {
- for i, v := range b {
- if a[i] != v {
- return false
- }
- }
- return true
- }
- func permuteUnique(nums []int) [][]int {
- if len(nums) == 0 {
- return [][]int{}
- }
- res := [][]int{nums}
- last := make([]int, len(nums))
- copy(last, nums)
- for {
- solution := make([]int, len(last))
- copy(solution, last)
- nextPermutation(solution)
- if isEqual(nums, solution) {
- break
- }
- copy(last, solution)
- res = append(res, solution)
- }
- return res
- }
- /* func main() {
- a1 := []int{1, 1, 2, 3}
- fmt.Println(permuteUnique(a1))
- } */
|