Next Permutation
题目
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
给定一个序列,如1,2,3求下一个比它大的由相同元素组成的序列。
思路
从低位到高位如果是升序,则已经是最大值。找到开始降序的位记为n,将它与低位的符合条件的数相交换,这个条件是:低位的数最贴近地大于开始降序的那个位的数值。最后,将n后的低位再按升序排列。即可得到最贴近地大于原序列的新序列了。
AC代码
public class Solution {
public void nextPermutation(int[] nums) {
if( nums.length <= 1){
return;
}
int i = nums.length - 2;
//找到降序位
while( i >= 0 && nums[i] >= nums[i+1]){
i--;
}
// 如果这个下降点还在数组内,我们找到一个比它稍微大一点的数替换
// 如果在之外,说明整个数组是降序的,是全局最大了
if(i >= 0){
for(int k = nums.length - 1; k > i; k--){
if(nums[k] > nums[i]){
swap(nums, k, i);
break;
}
}
}
//将降序位以后的低位部分倒序成为一个最小序列
reverse(nums, i + 1, nums.length - 1);
}
private void swap(int[] nums,int i,int j){
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
private void reverse(int[] nums,int left, int right){
while(left < right){
swap(nums, left, right);
left++;
right--;
}
}
}