Leetcode31 下一个排列

一、问题描述

二、解题思路

采用找、换、翻3步骤来解决这个问题:

<1>找:从右向左找到第一个可以增大的位置i,即最小的可以增大的位置;

<2>换:将该位置的数与i+1,nums.size()-1区间最小的但大于其的数交换;

<3>翻:将i+1,nums.size()-1区间翻转,由于该集合为降序,所以进行逆转,保证增幅最小。

三、代码实现

cpp 复制代码
class Solution {
public:
    void nextPermutation(vector<int>& nums) {
        //找增幅最小的排列
        int n=nums.size();
        //1.找:从右向左找到第一个可以增大的位置i
        int i=n-2;
        while(i>=0&&nums[i]>=nums[i+1]) i--;
        //2.换:将该位置的数与[i+1,nums.size()-1]区间最小的大于其的数交换
        int j=n-1;
        if(i>=0){
            while(j>i&&nums[j]<=nums[i]) j--;
            swap(nums[i],nums[j]);
        }
        //3.翻:将[i+1,nums.size()-1]区间翻转
        reverse(nums.begin()+i+1,nums.end());
    }
};
相关推荐
.道阻且长.9 小时前
2.LeetCode算法习题讲解--双指针--复写零
算法·leetcode·职场和发展
·薯条大王9 小时前
经济实惠玩云服务器|一台云服务器多人共用,子账号配置教程
java·linux·运维·服务器·汇编·c++·python
To_OC10 小时前
LC 438 找到所有字母异位词:暴力超时后,我靠滑动窗口一招搞定
javascript·算法·leetcode
白狐_79811 小时前
408数据结构第5章:二叉树遍历序列题——技巧、判断与真题型总结
数据结构
Forever Nore13 小时前
学完C语言力扣第一题做不来正常吗
数据结构·算法
hansang_IR14 小时前
【题解】LC:倍增 / 区间并查集(Range Parallel Unionfind)
c++·算法·并查集
东东最爱敲键盘14 小时前
day7.c++继承
c++
沫璃染墨15 小时前
《从零入门Linux系统篇(十五):系统工具篇·六——GDB调试器详解:从程序执行控制到高级调试技巧》
linux·运维·服务器·c语言·c++
吃着火锅x唱着歌15 小时前
Effective C++ 学习笔记 条款40 明智而审慎地使用多重继承
c++·笔记·学习