码迷,mamicode.com
首页 > 其他好文 > 详细

LC31 Next Permutation

时间:2016-04-02 20:20:43      阅读:257      评论:0      收藏:0      [点我收藏+]

标签:

有关排列的题目,如果用DFS去做,就十分低效。这里介绍一种做法:求下一个序列,先从尾部开始找最长的递增数组,如果从尾到头都是递增,则这已经是最大序列,下一个序列就是将最大序列翻转一下。如果不存在递增数组,则将最后两位数交换一下。其他情况,则记录下递增数组的前一位数,并找出递增数组中比这个数大的最小的那个数,交换两个数位置,然后将这个递增数组翻转一下,结果就是下一个序列。网上可以找到相关证明。

技术分享
 1 class Solution {
 2 public:
 3     void nextPermutation(vector<int>& nums) {
 4         if(nums.size()<=1)
 5             return;
 6         int i=nums.size()-1;
 7         while(i>=1&&nums[i-1]>=nums[i])
 8         {
 9             i--;
10         }
11         if(i==0)
12         {
13             reverse(nums.begin(),nums.end());
14         }
15         else if(i==nums.size()-1)
16         {
17             swap(nums[i],nums[i-1]);
18         }
19         else
20         {
21             i--;
22             int j;
23             for(j=nums.size()-1;j>=i;j--)
24             {
25                 if(nums[j]>nums[i])
26                     break;
27             }
28             swap(nums[i],nums[j]);
29             reverse(nums.begin()+i+1,nums.end());
30         }
31     }
32 };
View Code

如果要求上一个序列,则是找最长的递减数组。其他分析都差不多。

技术分享
 1 class Solution {
 2 public:
 3     void prevPermutation(vector<int>& nums) {
 4         if(nums.size()<=1)
 5             return;
 6         int i=nums.size()-1;
 7         while(i>=1&&nums[i-1]<=nums[i])
 8         {
 9             i--;
10         }
11         if(i==0)
12         {
13             reverse(nums.begin(),nums.end());
14         }
15         else if(i==nums.size()-1)
16         {
17             swap(nums[i],nums[i-1]);
18         }
19         else
20         {
21             i--;
22             int j;
23             for(j=nums.size()-1;j>=i;j--)
24             {
25                 if(nums[j]<nums[i])
26                     break;
27             }
28             swap(nums[i],nums[j]);
29             reverse(nums.begin()+i+1,nums.end());
30         }
31     }
32 };
View Code

 

LC31 Next Permutation

标签:

原文地址:http://www.cnblogs.com/vaecn/p/5348045.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!