【Leetcode】1053. Previous Permutation With One Swap

题目地址:

https://leetcode.com/problems/previous-permutation-with-one-swap/

给定一个长 n n n的数组 A A A,求一次交换下,字典序比 A A A小的最大的 A A A的重排。

由于要得到字典序尽量大的,我们考虑尽量改变靠后的数字,所以我们从后向前遍历,第一次遍历到 A [ i ] < A [ i − 1 ] A[i]<A[i-1] A[i]<A[i1]的时候,由于 A [ i ] A[i] A[i]之后已经是升序了,字典序已经最小了不能变小,从而变 A [ i ] A[i] A[i]是最好的。将其与其后比其小的最大数交换即可。有个特殊情况,如果后面有若干相等的比其小的最大数,则需要交换最左边那个,这样字典序最大。代码如下:

class Solution {
 public:
  vector<int> prevPermOpt1(vector<int>& a) {
    for (int i = a.size() - 1; i; i--)
      if (a[i] < a[i - 1]) {
        int j = i;
        while (j < a.size() && a[j] < a[i - 1]) j++;
        j--;
        while (a[j] == a[j - 1]) j--;
        swap(a[i - 1], a[j]);
        break;
      }

    return a;
  }
};

时间复杂度 O ( n ) O(n) O(n),空间 O ( 1 ) O(1) O(1)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值