下一个排列的实现

Posted by Liao on 2022-07-01

整数数组的下一个排列,是指下一个字典序更大的排列,如123下一个排列是132

以下算法思想是c++ next_permutation的实现

以【1,2,3,8,5,7,6,4】的下一个排列为例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class Solution {
public:
void nextPermutation(vector<int>& nums) {
int n = nums.size();
int i = n - 2, j = n - 1, k = n - 1;

//1、从后往前找第一对相邻升序对,是5和7
while(i >= 0 && nums[i] >= nums[j]) {
i--;
j--;
}
//2、从后往前找nums[k] > nums[i] 是6,便交换得:【1,2,3,8,6,7,5,4】
if (i >= 0) {
while(nums[i] >= nums[k]) {
k--;
}
//3、交换
swap(nums[i], nums[k]);
}

//4、nums[j]-nums[k]升序 【1,2,3,8,6,4,5,7】
int l = j, r = n - 1;
while(l < r) {
swap(nums[l], nums[r]);
l++;
r--;
}
}
};