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());
    }
};
相关推荐
C^h3 小时前
c++ string
开发语言·c++
raindayinrain4 小时前
c++高性能--原子操作,无锁编程,操作顺序
开发语言·c++·性能优化
学逆向的4 小时前
C++ 合并命名空间
开发语言·c++·网络安全
Zhao-Jichao4 小时前
VS2026 打包 C++ 程序生成 EXE,借助 Installer Project 扩展工具
开发语言·c++
小徐不徐说5 小时前
C++ 接口与插件设计:从工厂注册到 Qt 动态插件
数据库·c++·qt·系统架构·程序设计
Yuzhiyuxia5 小时前
【AI Agent面试系列】AI Agent记忆机制知识点1
人工智能·面试·职场和发展
大都督会赢的5 小时前
C++第一节课
开发语言·c++
UIU1145 小时前
P1233 [ICPC 2001 Taejon R] 木棍加工
数据结构·c++·算法·动态规划
论文复现现场5 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
ZhengEnCi6 小时前
用 AI 写代码为什么拼到最后还是拼人:算力瓶颈与领域专家提示词的本质差异
算法·架构