【Leetcode】【Next Permutation】【下一个排列】【C++】

  • 题目:

       实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。

       如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。  

       必须原地修改,只允许使用额外常数空间。

  • 思路:(以1、2、3、4、5为例)

1  2  3  4  5

1  2  3  5  4

1  2  4  3  5

1  2  4  5  3

1  2  5  3  4

1  2  5  4  3

1  3  2  4  5

……

【1  3  5  4  2    =》 【1  4  5  3  2 】 =》 【1  4  2  3  5

综合以上,找某序列的下一个排列算法为:

1、找到右边“”最长“”的降序子序列,如【5,4,2】,此时pos定位到“3”的位置

2、从右到左遍历降序子序列【5,4,2】,找到第一个大于3的元素,并交换(如上图红色值)

3、将第二步得到的子序列翻转即可得到下一个排列;

  • 代码:
    class Solution {
    public:
        void nextPermutation(vector<int>& nums) {
            int len=nums.size();
            int pos=-1;
            for(int i=len-1; i>0; i--)
            {
                if(nums[i]>nums[i-1])
                {
                    pos=i-1;
                    break;
                }
            }
            if(pos==-1)
            {
                reverse(nums.begin(),nums.end());
                return;
            }
            for(int i=len-1; i>pos;i--)
            {
                if(nums[i]>nums[pos])
                {
                    int temp=nums[pos];
                    nums[pos]=nums[i];
                    nums[i]=temp;
                    break;
                }
            }
            reverse(nums.begin()+pos+1, nums.end());
            return ;
        }
    };

     

  • prevPermutation算法:

将以上步骤逆过来即可,如求【1  4  2  3  5 】的前一个排列:

【1  4  2  3  5 】 =》 【1  3  2  4  5 】  =》【1  3  5  4  2

  1.     找最长升序子序列,如图【2,3,5】
  2.     交换4 和 3 (具体原因见nextPermutation)
  3.     颠倒交换后的子序列

 

 

 

 

 

 

 

 

 

posted @ 2018-11-13 15:00  dreamer123  阅读(377)  评论(0编辑  收藏  举报