题目:
实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须原地修改,只允许使用额外常数空间。
以下是一些例子,输入位于左侧列,其相应输出位于右侧列。1,2,3
→ 1,3,2
3,2,1
→ 1,2,3
1,1,5
→ 1,5,1
【0】【1】【2】
解题思路:
题目的总体思路是。从后往前读。当后面的数比前面的数大时,再开一个循环,从后开始于当前数比較。当比当前数大时,交换。然后再从当前数的后一位開始,直到最后反序就可以。
class Solution { public void nextPermutation(int[] nums) { //高位为nums[0] if(nums != null && nums.length >1){ int i; for(i = nums.length-2;i>=0;i--){ if(nums[i+1]>nums[i]){ break; } } if(i >= 0){ //如果整个序列为逆序时,i小于0 reverse整个序列,否则找到比nums[i]大的交换次序 int k; for(k=nums.length-1;k>=0;k--){ if(nums[k]>nums[i]){ break; } } swap(nums,k,i); } reverse(nums, i+1); } } private void reverse(int[] nums, int start) { int left = start; int right = nums.length - 1; while (left < right) { swap(nums, left, right); left++; right--; } } private void swap(int[] nums, int i, int j) { int temp = nums[i]; nums[i] = nums[j]; nums[j] = temp; } }