描述:
给定一个整数数组来表示排列,按升序找出其下一个排列。
在线测评地址
样例 1:
输入:
数组 = [1]
输出:
[1]
解释:
只有一个整数,下一个排列是自己。
样例 2:
输入:
数组 = [1,3,2,3]
输出:
[1,3,3,2]
解释:
[1,3,2,3]的下一个排列是[1,3,3,2]。
样例 3:
输入:
数组 = [4,3,2,1]
输出:
[1,2,3,4]
解释:
没有字典序更大的排列时,输出字典序最小的排列。
算法思路:
1.从后往前寻找不是递增的下标i
2.从i 往后找到比下标i 对应的数字大的 且值最小的那个,令它为k
3.交换i k
4.把从i+1到整个数组最后一个反转
5.如果一直没有找到下降的点,则全部逆转即可。(从完全的降序改为了升序)
源代码:
using namespace std;
class Solution {
public:
/**
* @param nums: An array of integers
* @return: nothing
*/
void nextPermutation(vector<int> &nums) {
// write your code here
// 从后往前寻找第一个不是递增的位置i
int i = nums.size() - 2;
while(i >= 0 && nums[i] >= nums[i + 1]) {
i--;
}
// i>=0 说明nums不是完全降序的
if(i >= 0) {
//从i往后找,找到比i大的,且最小的那个
int j = i + 1;
while(j < nums.size() && nums[j] > nums[i]) {
j++;
}
j--;
// 交换i和j
swap(nums[i], nums[j]);
}
//反转i之后的数组,让之前的从后往前的递增部分改成了从前往后递增,这样才能是下一个排列
i = i + 1;
int j = nums.size() - 1;
while(i < j) {
swap(nums[i], nums[j]);
i++;
j--;
}
for(int i = 0; i < nums.size(); i++) {
if(i == nums.size() - 1)printf("%d\n", nums[i]);
else printf("%d,", nums[i]);
}
}
};