[LeetCode] #31 下一个排列
实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列(即,组合出下一个更大的整数)。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须 原地 修改,只允许使用额外常数空间。
输入:nums = [1,2,3]
输出:[1,3,2]
分三步(以68754为例)
从右往左找,比后一个数小的数(6)
从右往左找,比第一步找到的数大的第一个数,交换位置(78654)
反转这个数后面的所有数(78645)
class Solution { public void nextPermutation(int[] nums) { //1 int i = nums.length-2; while(i >= 0 && nums[i] >= nums[i+1] ){ i--; } if(i == -1) reverse(nums, i+1); else{ //2 int j = nums.length-1; while(i >= 0 && nums[i] >= nums[j]){ j--; } swap(nums, i, j); //3 reverse(nums, i+1); } } public void swap(int[] nums, int a, int b){ int temp = nums[a]; nums[a] = nums[b]; nums[b] = temp; } public void reverse(int[] nums,int i){ int left = i, right = nums.length-1; while(left < right){ swap(nums, left, right); left++; right--; } } }
知识点:无
总结:无