实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须原地修改,只允许使用额外常数空间。
以下是一些例子,输入位于左侧列,其相应输出位于右侧列。
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/next-permutation
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:题目就是要找一个比nums大而且最接近的一个数,否则返回倒序。
从后向前遍历数组,找到nums[i-1]<nums[i]的元素,然后从遍历过后面的数组找一个比nums[i-1]大且最接近的元素,将其交换,然后对后面数组进行排序,使其升序,由于之前已经确认其为降序,所以定义两指针交换首尾即可。
public void nextPermutation(int[] nums) {
int length = nums.length;
for (int i = length-1; i >= 1; i--) {
if(nums[i] <= nums[i-1]){
continue;
}else {
int index = 0;
int min = Integer.MAX_VALUE;
for (int j = length-1; j >= i; j--) {
if(nums[j] < min && nums[j] > nums[i-1]){
min = nums[j];
index = j;
}
}
int tmp = nums[i-1];
nums[i-1] = nums[index];
nums[index] = tmp;
int left = i;
int right = length - 1;
while(left<right){
int cur = nums[left];
nums[left] = nums[right];
nums[right] = cur;
left++;
right--;
}
return;
}
}
int i = 0,j = length-1;
while(i < j){
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
i++;
j--;
}
}