下一个排列——字典序

314 阅读1分钟

image.png

方法1(两遍for循环) :

第一遍for循环,从后往前找到第一个非增序的元素i,
第二遍for循环,从后往前找到第一个比i大的元素j
交换位置
将i之后的元素升序排列,不包括i

func nextPermutation(nums []int)  {
    n := len(nums)
    i := n - 2 
    for i >= 0 && nums[i] >= nums[i+1] {
        i--
    }
    if i >= 0 {
        j := n-1
        for j >= 0 && nums[i] >= nums[j] {
            j--
        }
        nums[i],nums[j] = nums[j],nums[i]
    }
    sort.Ints(nums[i+1:])
}

可以直接反转无序升序排列

func nextPermutation(nums []int) {
    n := len(nums)
    i := n - 2
    for i >= 0 && nums[i] >= nums[i+1] {
        i--
    }
    if i >= 0 {
        j := n - 1
        for j >= 0 && nums[i] >= nums[j] {
            j--
        }
        nums[i], nums[j] = nums[j], nums[i]
    }
    reverse(nums[i+1:])
}

func reverse(a []int) {
    for i, n := 0, len(a); i < n/2; i++ {
        a[i], a[n-1-i] = a[n-1-i], a[i]
    }
}