[LEETCODE31] 下一个排列

Description

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

Solution

思路上,我们希望靠左的数尽可能不动,只在靠右的一些数间进行修改。

我们找到最大的满足 \(a[i]<a[i+1]\)\(i\),找到最大的满足 \(a[j]>a[i]\)\(j\),交换 \(a[i],a[j]\),此时 \(a[i+1..n]\) 仍然是降序的,我们需要反转它来将其变为升序。

class Solution {
public:
    void nextPermutation(vector<int>& nums) {
        int n=nums.size();
        vector<int>& a=nums;
        int i=-1;
        for(i=n-2;i>=0;--i) if(a[i]<a[i+1]) break;
        if(i==-1)
        {
            for(int i=0;i<n;i++) for(int j=0;j<i;j++) if(a[i]<a[j]) swap(a[i],a[j]);
        }
        else 
        {
            int j=n;
            for(j=n-1;j>i;j--) if(a[j]>a[i]) break;
            swap(a[i],a[j]);
            reverse(a.begin()+i+1,a.end());
        }
    }
};

相关文章:

  • 2021-07-26
  • 2021-10-18
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-08-03
  • 2021-08-08
  • 2022-02-03
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-08-29
  • 2021-09-13
  • 2021-08-31
相关资源
相似解决方案