题目: 给定一个数组, 找出其permutation中下一个大的permutation;
解释: 按照从小到大的顺序,如果数组是12432, 那么需要返回13224, 即下一个比他大的数组。
题解:
1.从右往左遍历数组,一旦发现有降序相邻数组,即nums[i] > nums[i-1], 那么变化一定是在nums[i-1],使从i-1向后的数组成为原数组i-1向后数组的下一个最大permutation;
2. 确定改变位置之后,需要找到下一个最大的值与i-1位置的值交换,这里注意,是要找到比nums[i-1]大的值中最小的数,这样才能使permutation是next greater;
3. 排序从i开始的子数组,使其递增;
class Solution {
public void nextPermutation(int[] nums) {
for (int i = nums.length - 1; i >= 1; i--) {
if (nums[i] > nums[i-1]) {
sort(nums, i);
for (int j = i; j < nums.length; j++) {
if (nums[j] > nums[i - 1]) {
swap(nums, i - 1, j);
break;
}
}
return;
}
}
Arrays.sort(nums);
}
private void swap(int[] nums, int a, int b) {
int temp = nums[a];
nums[a] = nums[b];
nums[b] = temp;
}
private void sort(int[] nums, int i) {
int[] temp = new int[nums.length - i];
System.arraycopy(nums, i, temp, 0, temp.length);
Arrays.sort(temp);
System.arraycopy(temp, 0, nums, i, temp.length);
}
}
method sort可以用改为reverse,不过复杂度没有变化;O(n)