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());
    }
};
相关推荐
凤凰院凶涛QAQ1 小时前
《Java版数据结构 & 集合类剖析》链表与LinkedList:节点手拉手,增删不用愁
java·数据结构·链表
Cx330❀1 小时前
【Linux网络】高性能 TCP 服务器:从多线程到线程池的架构演进与落地实践
linux·运维·服务器·网络·c++·tcp/ip·架构
c238561 小时前
C++的IO流深入理解(上)
开发语言·c++
炘爚2 小时前
Phase 4:业务线程池 — IO/计算解耦
linux·c++
张小姐的猫2 小时前
【Linux】多线程 —— 线程池 | 单例模式 | 常见锁
linux·运维·服务器·c++·单例模式·设计模式·策略模式
_日拱一卒2 小时前
LeetCode:39组合总和
java·算法·leetcode·职场和发展
无限进步_2 小时前
【Linux】进程状态、僵尸与孤儿、进程调度
linux·运维·服务器·开发语言·数据结构·算法
郝学胜-神的一滴2 小时前
力扣 662 :二叉树最大宽度
java·数据结构·c++·python·算法·leetcode·职场和发展
2301_764441332 小时前
基于Stackelberg博弈的分散式库存模型
python·算法·数学建模