题目:下一个排列
思路:找到下一个排序,意思就是将当前数组视作一串数字,通过对元素的重新组合,找到第一个大于当前数字的数字
具体实现: 首先从后往前找到第一个逆序的数字,保存它的下标——如:123546718,这里会保存数字“4”的下标,也就是 4,之后再在 46718 这个范围内从后往前寻找第一个小于 5 的数字,并将其进行交换(123146758);最后将46758进行降序·排序即可得到下一个排序
1void nextPermutation(vector<int>& nums)
2{
3 int sz = nums.size();
4 if(sz <= 1) return;
5 int i = sz - 1;
6 while(0 < i && nums[i] <= nums[i - 1])
7 {
8 i--;
9 }
10
11 // 如果 i == 0,说明整个序列都是降序的(如 54321),已经是最大排列
12 if(0 < i)
13 {
14 int j = sz - 1;
15 while(nums[j] <= nums[i - 1])
16 {
17 j--;
18 }
19
20 std::swap(nums[i - 1], nums[j]);
21 }
22 std::sort(nums.begin() + i, nums.end());
23}