【LeetCode每日一题】[中等]31. 下一个排列
31. 下一个排列
题目来源
算法思想:数组
题目:
算法思路:link.
java代码
class Solution {
public void nextPermutation(int[] nums) {
int n = nums.length;
int i = n - 1;
while (i > 0 && nums[i-1] >= nums[i]) {
//从后向前遍历,找第一个下降点i-1
i--;
}
if (i > 0) {
//如果第一个下降点不是0,则需要进行交换
int j = i;//指向下降点i-1的下一个点,利用[i,n-1]区间是非递增
while (j < n && nums[i-1] < nums[j]) {
//从前向后遍历,寻找大于下降点的数,这个数是大于下降点数中最小的数
j++;
}//j-1是要找的那个数
swap(nums, i-1, j-1);//交换两个数
}
reverse(nums, i);//将交换后的i-1之后的区间进行逆转(该区间是非递增,只要逆转即可以有序)
}
private void reverse(int[] nums, int i) {
//逆转一个区间,
int j = nums.length-1;
while (i < j) {
swap(nums, i, j);
i++;
j--;
}
}
private void swap(int[] nums, int i, int j) {
//交换数组中的两个数
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}
}