leetcode刷题--数组

该博客讨论了一个算法问题,即如何实现一个函数来找到一个整数序列(数字排列)的字典序下一个更大的排列。解法涉及到从右到左查找升序对,并反转特定子序列来找到下一个更大的排列。如果不存在更大的排列,则将序列排序为最小的升序排列。核心步骤包括找到降序子序列,交换一个小于后续元素的数字,并反转剩余部分。
摘要由CSDN通过智能技术生成

day5--下一个排列

题目描述

实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列(即,组合出下一个更大的整数)。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须 原地 修改,只允许使用额外常数空间。
比如:
输入:nums = [1,2,3]
输出:[1,3,2]

解法

把所有数字看成一个整数,将所有数字全部排列,找出该整数的下一个数字排列。
比如:13456这几个数字,所有排列成的整数有:
13456
13465
13546

65431
找出13465的下一个整数,也就是13546。需要找到一个‘小数’,将其与后面的较小的‘大数’交换,再将’小数‘后的所有数进行升序排列
思路:
1)从右往左找升序的(i,j),使nums[i]<nums[j],则[j,end)都是降序
2)从{
[j,end)中从后往前找一个a,使得nums[i]<nums[a],将nums[i]与nums[a]交换,然后将[j,end)的数字进行升序排列,就找到了下一个大的排列了。
代码:

class Solution {
public:
    void nextPermutation(vector<int>& nums) {
        int i=nums.size()-2,j=nums.size()-1;
        while(i>=0&&nums[i]>=nums[j]){
            i--;
            j--;
        }
        if(i>=0){
            int a=nums.size()-1;
            while(nums[i]>=nums[a]){
                a--;
            }
            swap(nums[i],nums[a]);
            
        }
        reverse(nums.begin()+j,nums.end());
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值