题目描述

实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须 原地 修改,只允许使用额外常数空间。
以下是一些例子,输入位于左侧列,其相应输出位于右侧列。
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1

来源,leetcode 每日一题 31. 下一个排列

解题思路

从右边往左,找到第一个下降的数字,然后从右边中找到比它大且最接近它的数字,进行替换,然后将其右侧按照升序排列即可。
31. 下一个排列 - 图1

代码

  1. class Solution {
  2. public:
  3. void nextPermutation(vector<int>& nums) {
  4. int flag = 0;
  5. int last = nums[nums.size() - 1];
  6. vector<int>:: iterator it;
  7. for (it = nums.end() - 1; it >= nums.begin(); it--) {
  8. if (*it >= last) {
  9. last = *it;
  10. } else {
  11. for (vector<int>:: iterator it2 = nums.end() - 1; it2 != it; it2--) {
  12. if (*it2 > *it) {
  13. int temp = *it2;
  14. *it2 = *it;
  15. *it = temp;
  16. break;
  17. }
  18. }
  19. break;
  20. }
  21. }
  22. it++;
  23. sort(it, nums.end());
  24. }
  25. };