LeetCode 31 Next Permutation
来源:互联网 发布:centos libssl dev 编辑:程序博客网 时间:2024/06/13 13:03
题意:举个栗子
123
132
213
231
312
321
如上所示,题目的意思是,从上面的某一行重排到期下一行,如果已经是最后一行了,则重排成第一行。
先从后往前看,直到某一个值大于它的前一个值,这个值(位置表示为length)的前一个值就是要替换的。接下来在length-1之后的所有比length-1的值大的值中找出最小的,二者交换。这个过程由于后面一定是递减的,所以从最后开始找第一个大于length-1的值与其交换。再将交换位置后的值进行升序排列。这里由于后面的值都是递减的,所以将length及之后的值按第一个与最后一个交换,第二个与倒数第二个交换...实现方法是length和last两个指针,交换一次后length++,last--。直到跳出循环(length<last)。代码如下:
class Solution {
public void nextPermutation(int[] nums) {
int length = nums.length - 1;
while (length > 0){
if (nums[length] > nums[length - 1])
break;
--length;
}
if (length == 0) {
Arrays.sort(nums);
}else{
int j = nums.length - 1;
for (; j > length; j--) {
if (nums[j] > nums[length - 1])
break;
}
swap(nums, length - 1, j);
int last = nums.length - 1;
int i = length;
while (i < last){
swap(nums, i, last);
i++;
last--;
}
}
}
public void swap(int[] nums, int i, int j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}