力扣_数组8—下一个排列

本文介绍了如何使用编程实现数组的下一个字典序排列,通过三步策略:找到第一个非递增的位置,与右侧最大数交换,然后调整剩余部分为递增顺序。给出了一个名为Solution的类中的nextPermutation函数实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

  • 原题目看不懂他在说什么,这里简单描述一下
  • 字典序:英文字典中单次的排序方法,即比较第一个字母,相同则比较第二个字母,以此类推
  • 本题要求给出输入数组的下一个排列,类似字典中一个单词的下一个单词
  • 例子 [ 1 , 4 , 8 , 5 , 3 , 2 , 1 ] [1, 4, 8,5,3,2,1] [1,4,8,5,3,2,1] 的下一个是 [ 1 , 5 , 1 , 2 , 3 , 4 , 8 ] [1,5,1,2,3,4,8] [1,5,1,2,3,4,8] [ 1 , 4 ] [1,4] [1,4] 开头的已经没有更大的了,因此下一个是 [ 1 , 5 ] [1,5] [1,5] 开头的最小的)

思路(三步走)

  • 观察上面的例子,可以看出由于 [ 1 , 4 ] [1,4] [1,4] 后面的序列是递减的,已经是最大的了,因此需要改第二位,即把 4 4 4 变大;
    因此,第一步是从右往左找,发现数组不递增时 b r e a k break break ,记下此时的索引 i i i 及 对应的值(上面例子中索引和值分别为 1 , 4 1,4 1,4);
  • 第二步是寻找哪个数和 4 4 4 交换,同样从右往左找,找到第一个大于 4 4 4 的数,将其和 4 4 4 替换(上面例子中 5 5 5 4 4 4 替换,新的数组变为 [ 1 , 5 , 8 , 4 , 3 , 2 , 1 ] [1, 5, 8,4,3,2,1] [1,5,8,4,3,2,1]
  • 第三步是将 [ 1 , 5 ] [1,5] [1,5] 后面的序列从递减变为递增(可用双指针),即变成 [ 1 , 5 , 1 , 2 , 3 , 4 , 8 ] [1,5,1,2,3,4,8] [1,5,1,2,3,4,8]

代码

class Solution {
public:
    void nextPermutation(vector<int>& nums) {
        int n = nums.size();
        if(n > 1){
            int temp;
            int temp_ind;
            int flag = 0;
            for(int i = n-1; i > 0; i--){
                if(nums[i-1] < nums[i]){
                    temp = nums[i-1]; 
                    temp_ind = i-1; 
                    flag = 1;
                    break;
                }
            }
            if(flag){
                for(int i = n-1; i > 0; i--){
                    if(nums[i] > temp){
                        int t = nums[i];
                        nums[i] = temp;
                        nums[temp_ind] = t;
                        break;
                    }
                }
                int pl = temp_ind + 1, pr = n - 1;
                while(pl < pr){
                    int t = nums[pr];
                    nums[pr] = nums[pl];
                    nums[pl] = t;
                    pl++;
                    pr--;
                }
            }
            else{
                sort(nums.begin(), nums.end());
            }
        }
    }
};
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值