Medium
面经题
很直观的思路。找next permutation先找哪里可以下手,也就是从后到前数第一个nums[j-1] < nums[j]的地方,比如1243 找到2那里,next permutation就是1324. 找到2的index也就是代码里的first. 然后再找2后面最小的数这里是3,把它跟2交换,再把3后面的sort一下就好。注意一下edge case,比如第一次求first求出来是-1, 那说明整个已经最大了,都是降序,那返回一个最低排列就是正常升序就好了。
class Solution {
public void nextPermutation(int[] nums) {
if (nums == null || nums.length == 0 || nums.length == 1){
return;
}
int first = -1;
for (int i = nums.length - 1; i > 0; i--){
if (nums[i-1] < nums[i]){
first = i-1;
break;
}
}
if (first == -1){
Arrays.sort(nums);
return;
}
int nextMin = Integer.MAX_VALUE;
int nextMinIndex = -1;
for (int j = first + 1; j < nums.length; j++){
if (nums[j] <= nums[first]){
continue;
}
if (nums[j] < nextMin){
nextMin = nums[j];
nextMinIndex = j;
}
}
swap(nums, first, nextMinIndex);
Arrays.sort(nums, first+1, nums.length);
}
private void swap(int[] nums, int i, int j){
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}