下一个排列。实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列(即,组合出下一个更大的整数)。
  KRe60ogUm4le 29天前 40 0

下一个排列。实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列(即,组合出下一个更大的整数)。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须 原地 修改,只允许使用额外常数空间。
来自力扣31。

从右往左遍历,遇到降序停止。交换,反序。
时间复杂度:O(N)。
空间复杂度:O(1)。

代码用golang编写。代码如下:

package main

import (
    "fmt"
)

func main() {
    nums := []int{1, 3, 2}
    nextPermutation(nums)
    fmt.Println(nums)
}

func nextPermutation(nums []int) {
    N := len(nums)
    // 从右往左第一次降序的位置
    firstLess := -1
    for i := N - 2; i >= 0; i-- {
        if nums[i] < nums[i+1] {
            firstLess = i
            break
        }
    }
    if firstLess < 0 {
        reverse(nums, 0, N-1)
    } else {
        rightClosestMore := -1
        // 找最靠右的、同时比nums[firstLess]大的数,位置在哪
        // 这里其实也可以用二分优化,但是这种优化无关紧要了
        for i := N - 1; i > firstLess; i-- {
            if nums[i] > nums[firstLess] {
                rightClosestMore = i
                break
            }
        }
        //swap(nums, firstLess, rightClosestMore);
        nums[firstLess], nums[rightClosestMore] = nums[rightClosestMore], nums[firstLess]
        reverse(nums, firstLess+1, N-1)
    }
}

func reverse(nums []int, L, R int) {
    for L < R {
        nums[L], nums[R] = nums[R], nums[L]
        L++
        R--
    }
}

执行结果如下:

2022-01-07:下一个排列。实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列(即,组合出下一个更大的整数)。 如果不存在下一个更大的排列,则将数字重新排列成

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 29天前 0

暂无评论

推荐阅读
KRe60ogUm4le
最新推荐 更多

2024-05-31