下一个排列
实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须原地修改,只允许使用额外常数空间。
以下是一些例子,输入位于左侧列,其相应输出位于右侧列。
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1
1 public class Solution{ 2 public void nextPermutation(int[] nums){ 3 int i=nums.length-2; 4 while(i>=0 && nums[i+1]<=nums[i]) 5 i--; 6 if(i>=0){ 7 int j=nums.length-1; 8 while(j>=0 && nums[j]<=nums[i]){ 9 j--; 10 } 11 swap(nums,i,j); 12 } 13 reverse(nums,i+1); 14 } 15 16 private void reverse(int[] nums,int start){ 17 int i=start,j=nums.length-1; 18 while(i<j){ 19 swap(nums,i,j); 20 i++; 21 j--; 22 } 23 } 24 25 private void swap(int[] nums,int i,int j){ 26 int temp=nums[i]; 27 nums[i]=nums[j]; 28 nums[j]=temp; 29 } 30 }