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
}
}
}