zoukankan      html  css  js  c++  java
  • 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
            }
    
        }
    }
    
  • 相关阅读:
    一篇文章讲清楚markdown
    webservice初体验-cxf
    IReport与web项目整合
    泛型
    观察者模式
    策略模式
    设计模式与面向对象
    JavaI/O(输入/输出)
    面向对象
    Java基础类库
  • 原文地址:https://www.cnblogs.com/ganshuoos/p/12832882.html
Copyright © 2011-2022 走看看