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());
    }
};
相关推荐
小小龙学IT8 小时前
Boost.PFR 开源结构体字段反射库深度解析
c++·开源
程序猿编码8 小时前
零依赖纯手写:C++ 实现完整神经网络,张量反向传播全打通
c++·神经网络·transformer·大模型推理
码匠许师傅8 小时前
【C++三方组件】utfcpp:UTF-8 字符串处理避坑
c++
彧azz8 小时前
Java学习记录:判断语句
java·笔记·学习·算法
alphaTao8 小时前
LeetCode 每日一题 2026/9/14-2026/9/20
算法·leetcode
hanlin038 小时前
刷题笔记:力扣第560题-和为k的子数组
笔记·算法·leetcode
蒸蒸yyyyzwd8 小时前
八股学习 MVCC 慢查询优化和 read 过程
c++·八股
APEX真好玩8 小时前
把高频传感器(IMU)数据封装进 MP4:FFmpeg 私有数据轨实践
c++
residual_fan8 小时前
航空发动机故障诊断专用智能体(四):深度强化学习与自适应奖励机制
人工智能·算法·数据挖掘·数据分析