Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers.
If such arrangement is not possible, it must rearrange it as the lowest possible order (ie, sorted in ascending order).
The replacement must be in-place, do not allocate extra memory.
Here are some examples. Inputs are in the left-hand column and its corresponding outputs are in the right-hand column.
1,2,3
→ 1,3,2
3,2,1
→ 1,2,3
1,1,5
→ 1,5,1
思路:使用字典序法
例设有排列(p)=2763541,按照字典式排序,它的下一个排列是谁?
(q)=2764135.
(1)2763541 [找最后一个正序35]
(2)2763541[找3后面比3大的最后一个数]
(3)2764531[交换3,4的位置]
(4)2764135[把4后面的531反序排列为135即得到最后的排列(q)]
public class Solution { public void nextPermutation(int[] num) { int i; int cur = -1; int temp; // find the last increase sequence for (i = num.length - 1; i >= 1; i--) { if (num[i] > num[i - 1]) { cur = i - 1; break; } } // if the increase sequence exists, //swap the cur and the last one(bigger than it) if (cur != -1) { for (i = num.length - 1; i > cur; i--) { if (num[i] > num[cur]) { temp = num[cur]; num[cur] = num[i]; num[i] = temp; break; } } } for (i = cur + 1; 2 * i <= cur + num.length - 1; i++) { temp=num[i]; num[i]=num[num.length-i+cur]; num[num.length-i+cur]=temp; } } }
时间: 2024-11-07 13:56:31