leetcode31.下一个排列
leetcode31.下一个排列
题目
实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列(即,组合出下一个更大的整数)。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须 原地 修改,只允许使用额外常数空间。
用例
输入:nums = [1,2,3]
输出:[1,3,2]
输入:nums = [3,2,1]
输出:[1,2,3]
输入:nums = [3,2,1]
输出:[1,2,3]
输入:nums = [1]
输出:[1]
求解
/**
* @param {number[]} nums
* @return {void} Do not return anything, modify nums in-place instead.
*/
var nextPermutation = function(nums) {
let len = nums.length;
let flag = false;
if(len==1){
return nums;
}
for(let i=len -2;i>=0;i--){
let min_index = null
//找出比i大的且最小的
for(let j=len-1;j>i;j--){
if(nums[j]>nums[i]){
if(min_index==null){
min_index=j
}else{
if(nums[j]<nums[min_index]){
min_index=j
}
}
}
}
//说明已经存在
if(min_index!=null){
//对第i个和第min_index进行交换
let temp = nums[i]
nums[i]=nums[min_index]
nums[min_index]=temp
//对i+1到len-1进行反转
let left = i+1
let right = len-1
while (left < right) {
// i 右边的数进行翻转,使得变大的幅度小一些
[nums[left], nums[right]] = [nums[right], nums[left]];
left++;
right--;
}
flag=true
break;
}
}
//如果flag==false,则返回最小的,使用排序
if(flag == false){
nums.sort(function(a, b){return a - b});
}
return nums;
};

浙公网安备 33010602011771号