题目描述:
实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须原地修改,只允许使用额外常数空间。
以下是一些例子,输入位于左侧列,其相应输出位于右侧列。
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1
解答:
package array; public class L31 { public static void nextPermutation(int[] nums) { int i = nums.length-2; while(i>=0 && nums[i]>=nums[i+1]){ i--; } if (i >= 0){ int chanum = i+1; while(chanum<nums.length && nums[chanum]>nums[i]){ chanum++; } //更改channums位置的数字与i位置的数字 swap(nums,chanum-1,i); } //需要将比i的索引大的数字全部进行翻转 reverse(nums,i); } public static void swap(int[] nums,int locate1,int locate2){ int temp = nums[locate1]; nums[locate1] = nums[locate2]; nums[locate2] = temp; } //由于nums中所有索引比start大的都是倒序的,所以此处只需要将该部分的数进行翻转 public static void reverse(int[] nums,int start){ int i = start+1,j = nums.length-1; while(i<j){ swap(nums,i,j); i++; j--; } } public static void main(String[] args) { //[5,4,7,5,3,2] //[5,5,3,4,2,7] //预期结果 //[5,5,2,3,4,7] int[] nums = new int[]{2,3,1}; nextPermutation(nums); for(int index = 0;index<nums.length;index++){ System.out.println(nums[index]); } } }
执行用时 :1 ms, 在所有 java 提交中击败了100.00%的用户
内存消耗 :36.5 MB, 在所有 java 提交中击败了89.88%的用户