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