谷歌真题回顾:下一个排列

该博客介绍了如何找出一个升序整数数组的下一个字典序排列。算法通过从后向前查找第一个非递增元素,然后找到比该元素大的最小值进行交换,并对部分数组进行反转来实现。当数组已经是降序时,会将整个数组反转得到最小的排列。代码使用C++实现,展示了详细的逻辑步骤。

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

描述:
给定一个整数数组来表示排列,按升序找出其下一个排列。
在线测评地址
样例 1:

输入:
数组 = [1]
输出:
[1]

解释:
只有一个整数,下一个排列是自己。
样例 2:

输入:
数组 = [1,3,2,3]
输出:
[1,3,3,2]

解释:
[1,3,2,3]的下一个排列是[1,3,3,2]。

样例 3:

输入:
数组 = [4,3,2,1]
输出:
[1,2,3,4]

解释:
没有字典序更大的排列时,输出字典序最小的排列。
算法思路:
1.从后往前寻找不是递增的下标i
2.从i 往后找到比下标i 对应的数字大的 且值最小的那个,令它为k
3.交换i k
4.把从i+1到整个数组最后一个反转
5.如果一直没有找到下降的点,则全部逆转即可。(从完全的降序改为了升序)
源代码:

using namespace std;
class Solution {
  public:
    /**
     * @param nums: An array of integers
     * @return: nothing
     */
    void nextPermutation(vector<int> &nums) {
        // write your code here
        // 从后往前寻找第一个不是递增的位置i
        int i = nums.size() - 2;
        while(i >= 0 && nums[i] >= nums[i + 1]) {
            i--;
        }
        // i>=0 说明nums不是完全降序的
        if(i >= 0) {
            //从i往后找,找到比i大的,且最小的那个
            int j = i + 1;
            while(j < nums.size() && nums[j] > nums[i]) {
                j++;
            }
            j--;
            // 交换i和j
            swap(nums[i], nums[j]);
        }
        //反转i之后的数组,让之前的从后往前的递增部分改成了从前往后递增,这样才能是下一个排列
        i = i + 1;
        int j = nums.size() - 1;
        while(i < j) {
            swap(nums[i], nums[j]);
            i++;
            j--;
        }
        for(int i = 0; i < nums.size(); i++) {
            if(i == nums.size() - 1)printf("%d\n", nums[i]);
            else printf("%d,", nums[i]);
        }
    }
};

更多题解参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值