leetcode刷题笔记三十一 下一个排列

leetcode刷题笔记三十一 下一个排列

源地址:31. 下一个排列

问题描述:

实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。

如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。

必须原地修改,只允许使用额外常数空间。

以下是一些例子,输入位于左侧列,其相应输出位于右侧列。
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1

代码补充:

//下一个排列为当前排列的后一位
//这种情况下存在两种情况
//当前排列已经是最大排列了 这种情况下直接原地倒序就可以了
//剩下的情况肯定存在后一个排列了
//通过判断后一个字符大于前一个字符即满足要求
//由于推算的排列是后一个,选择从后向前判断是否存在上述情况
object Solution {
    def nextPermutation(nums: Array[Int]): Unit = {
        //当nums为空或者仅为一个字符  直接返回就可以
        if (nums.length != 0 || nums.length != 1){
            val arrLength = nums.length
            //通过设定Key值,判断当前排列类型,-1:最大队列
            //其他值:出现后一个字符大于前一个字符的情况
            var key = -1
            //println("--------------------------")
            
            for (i <- (1 to arrLength-1).reverse if key == -1){
                if(nums(i) > nums(i-1)) key = i
            }
            println("-------------------------")
            println("key:"+key)
            //println(nums.slice(key,arrLength).reverse.mkString)
            if(key == -1){
                //nums.reverse
                //为最大排列,直接将其颠倒
                Nreverse(0, arrLength,nums)
            }
            else{
                //否则,设置rPos用于获取比当前key值略大的
                //交换位置
                //设置valve值用于获取这个值
                var rPos = -1
                var valve = nums(key)
                for(i <- key until arrLength){
                    if(nums(i) > nums(key-1) && nums(i) <= valve){
                        rPos = i
                        valve = nums(i)
                    }
                }
                println("rPos: "+rPos)
                //进行交换
                swap(key-1, rPos, nums)
                println(nums.mkString)
                //交换后的串进行颠倒(交换后的串应为自大到小)
                //将其颠倒 即为最小
                Nreverse(key, arrLength,nums)
                println(nums.mkString)
            }
        } 
    }

    def swap(key:Int, rPos:Int, nums:Array[Int]):Unit = {
        if (key != -1){
            val temp = nums(key)
            nums(key) = nums(rPos)
            nums(rPos) = temp 
        }
    }

    def Nreverse(key:Int, arrLength:Int, nums:Array[Int]){
        var left = key
        var right = arrLength-1
        while(left < right){
            val temp = nums(left)
            nums(left) = nums(right)
            nums(right) = temp
            left += 1
            right -=1
        }

    }
}
原文地址:https://www.cnblogs.com/ganshuoos/p/12832882.html