这是LeetCode上的一道题:
实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须原地修改,只允许使用额外常数空间。
以下是一些例子,输入位于左侧列,其相应输出位于右侧列。
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/next-permutation
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:从右向左扫描,我们假设从右向左是一个递增的序列,当碰到a[i-1]<a[i]后,停止扫描,并在a[a.length-1]和a[i]之间,从右向左,找到第一个比a[i-1]大的数,两者交换位置,然后对a[i]到a[a.length-1]的序列进行翻转的操作。
代码如下(Java):
class Solution { public void nextPermutation(int[] nums) { int i=nums.length-1; while(i-1>=0 && nums[i-1]>=nums[i]){ i--; } if(i==0){ reverse(nums,0); return; } int index = i; int j=nums.length-1; while(j>=index && nums[j]<=nums[index-1]){ j--; } swap(nums,index-1,j); reverse(nums,index); } public void reverse(int[] nums,int index){ int i=index; int j=nums.length-1; while(i<j){ swap(nums,i,j); i++; j--; } } public void swap(int[] nums,int i,int j){ int tmp = nums[i]; nums[i] = nums[j]; nums[j] = tmp; } }