题目:
解答:
从最末位寻找第一个破坏升序的数nums[pos - 1], 然后在遍历过的数里寻找比该数大的最小的一个数。
如遍历过的数为[7,6,4,3], nums[pos - 1]为5, 则5需要与6进行交换, 在将[7,5,4,3]改为升序(这里使用reverse)。
遍历过的数从后往前一定是升序, 故改为从前往后升序只需要反转该部分即可。
寻找第一个比nums[pos - 1]大的数, 只需改为从前往后升序之后, 从升序的第一个数开始遍历比较大小即可。
1 class Solution { 2 public: 3 void nextPermutation(vector<int>& nums) 4 { 5 int pos = nums.size() - 1; 6 while (pos > 0 && nums[pos] <= nums[pos - 1]) 7 { 8 pos--; 9 } 10 11 reverse(nums.begin() + pos, nums.end()); //逆序 12 if (pos > 0) 13 { 14 int start = pos; 15 for (; start < nums.size(); start++) 16 { 17 //寻找第一个大于nums[pos - 1]的数 18 if (nums[start] > nums[pos - 1]) 19 { 20 swap(nums[start], nums[pos - 1]); //交换 21 break; 22 } 23 } 24 } 25 } 26 };
原文:https://www.cnblogs.com/ocpc/p/12827805.html