题目:
实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须原地修改,只允许使用额外常数空间。
以下是一些例子,输入位于左侧列,其相应输出位于右侧列。
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1
题解:
根据官方的思路,从右往左找到第一个nums[i+1]>nums[i],再从nums[nums.length-1]到nums[i+1]包括nums[i+1]中找到比nums[i]大的数,交换位置。然后再把num[i]之后的序列翻转过来,翻转之前nums[i]后的序列一定是降序的,要不然不会找到nums[i+1]>nums[i].
/**
* @param {number[]} nums
* @return {void} Do not return anything, modify nums in-place instead.
*/
var nextPermutation = function(nums) {
var len=nums.length;
if(len==1){
return;
}
for(var i=len-2;i>=0;i--){
if(nums[i]<nums[i+1]&&i>=0){
for(var j=len-1;j>i;j--){
if(nums[j]>nums[i]&&j>=0){
swap(nums,i,j);
reverse(nums,i);
return;
}
}
}
}
reverse(nums,-1);
return;
};
const swap=function(nums,len1,len2){
var temp=nums[len1];
nums[len1]=nums[len2];
nums[len2]=temp;
};
const reverse=function(nums,i){
len1=nums.length-1;
j=i+1;
while(j<len1){
swap(nums,j,len1);
j++;
len1--;
}
};