LintCode:下一个排列

下一个排列

给定一个整数数组来表示排列,找出其之后的一个排列。

 注意事项

排列中可能包含重复的整数

样例

给出排列[1,3,2,3],其下一个排列是[1,3,3,2]

给出排列[4,3,2,1],其下一个排列是[1,2,3,4]

思路:

  参考:https://www.cnblogs.com/bakari/archive/2012/08/02/2620826.html

  如何计算字符串的下一个排列了?来考虑"926520"这个字符串,我们从后向前找第一双相邻的递增数字,"20"、"52"都是非递增的,"26 "即满足要求,称前一个数字2为替换数,替换数的下标称为替换点,再从后面找一个比替换数大的最小数(这个数必然存在),0、2都不行,5可以,将5和2交换得到"956220",然后再将替换点后的字符串"6220"颠倒即得到"950226"。

 1 class Solution {
 2 public:
 3     /**
 4      * @param nums: A list of integers
 5      * @return: A list of integers
 6      */
 7     int swap(int &a, int &b)
 8     {
 9         int tmp=a;
10         a=b;
11         b=tmp;
12     }
13     void reverseArray(vector<int> &nums, int begin, int end)
14     {
15         while(begin<end){
16             swap(nums[begin], nums[end]);
17             ++begin;
18             --end;
19         }
20     }
21     vector<int> nextPermutation(vector<int> &nums) {
22         if(nums.size()<=1)return nums;
23         int i;
24         for(i=nums.size()-2; i>=0; --i)//找替换点i
25         {
26             if(nums[i]<nums[i+1])break;
27         }
28         if(i==-1){
29             reverseArray(nums, 0, nums.size()-1);
30             return nums;
31         }
32         int j;
33         for(j=nums.size()-1; j>i; --j)//找出要和i替换的数的下标j
34         {
35             if(nums[i]<nums[j])break;
36         }
37         swap(nums[i], nums[j]);//替换
38         reverseArray(nums, i+1, nums.size()-1);//将i之后的数反转
39         return nums;
40     }
41 };

 

上一个排列

给定一个整数数组来表示排列,找出其上一个排列。

 注意事项

排列中可能包含重复的整数

样例

给出排列[1,3,2,3],其上一个排列是[1,2,3,3]

给出排列[1,2,3,4],其上一个排列是[4,3,2,1]

思路:和下一个排列的求法如出一辙。来考虑"926520"这个字符串,我们从后向前找第一双相邻的递增数字,"20"、"52"都是非递增的,"26 "即满足要求,称前一个数字2为替换数,替换数的下标称为替换点,再从后面找一个比替换数小的最小数(这个数必然存在),0可以,将0和2交换得到"906522",然后再将替换点后的字符串"6522"颠倒即得到"902256"。

 1 class Solution {
 2 public:
 3     /*
 4      * @param nums: A list of integers
 5      * @return: A list of integers that's previous permuation
 6      */
 7     void swap(int &a, int &b)
 8     {
 9         int tmp=a;
10         a=b;
11         b=tmp;
12     }
13     void reverseArray(vector<int> &nums, int begin, int end)
14     {
15         while(begin<end)
16         {
17             swap(nums[begin], nums[end]);
18             ++begin;
19             --end;
20         }
21     }
22     vector<int> previousPermuation(vector<int> &nums) {
23         if(nums.size()<=1)return nums;
24         int i;
25         for(i=nums.size()-2; i>=0; --i)
26         {
27             if(nums[i]>nums[i+1])break;
28         }
29         if(i==-1){
30             reverseArray(nums, 0, nums.size()-1);
31             return nums;
32         }
33         int j;
34         for(j=nums.size()-1; j>=0; --j)
35         {
36             if(nums[j]<nums[i])break;//只改了一处
37         }
38         swap(nums[i], nums[j]);
39         reverseArray(nums, i+1, nums.size()-1);
40         return nums;
41     }
42 };

 

 

 

posted @ 2018-03-26 10:24  jeysin  阅读(206)  评论(0编辑  收藏  举报