首页 > 编程语言 > 详细

【数组】31. 下一个排列

时间:2020-05-04 20:12:05      阅读:61      评论:0      收藏:0      [点我收藏+]

题目:

技术分享图片

 

 

解答:

从最末位寻找第一个破坏升序的数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 };

 

【数组】31. 下一个排列

原文:https://www.cnblogs.com/ocpc/p/12827805.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!