这一道题目的思路与上面46. Permutaions(http://blog.csdn.net/shenzhu0127/article/details/51781512)基本一样,是解法二中的一步,同样采用字典序法,可以直接写出来,但是要注意的是在46的解法二中,我们首先对数组进行了从小到大的排序,所以不会出现nextPermute([3,2,1])的情况,故而要加上对这种情况的处理:当出现这种情况的时候,也就是字典序法的第一步中得到的position < 0时,直接对整个数组进行reverse即可,代码如下:
public class Solution {
public void reverse(int[] nums, int begin, int end){
// Corner case
if(nums == null || nums.length == 0){
return;
}
int l = begin;
int r = end;
while(l < r){
int temp = nums[l];
nums[l] = nums[r];
nums[r] = temp;
l++;
r--;
}
}
public void nextPermutation(int[] nums) {
// Corner case
if(nums == null || nums.length == 0){
return;
}
// Find the last ascending position
int position = -1;
for(int i = nums.length - 1; i > 0; i--){
if(nums[i] > nums[i - 1]){
position = i - 1;
break;
}
}
// If ascending order does not exists, reverse nums
if(position < 0){
reverse(nums, 0, nums.length - 1);
return;
}
// If ascending order exists, find the last element larger than nums[position]
for(int i = nums.length - 1; i > 0; i--){
if(nums[i] > nums[position]){
int temp = nums[i];
nums[i] = nums[position];
nums[position] = temp;
break;
}
}
// Reverse number after position
reverse(nums, position + 1, nums.length - 1);
}
}
知识点:
1. 对于array某个区间内的reverse方式:void reverse(int[] nums, int begin, int end)