首页 > 其他分享 >下一个排列

下一个排列

时间:2025-01-10 21:55:54浏览次数:2  
标签:arr 排列 nums 一个 元素 数组

整数数组的一个 排列  就是将其所有成员以序列或线性顺序排列。

  • 例如,arr = [1,2,3] ,以下这些都可以视作 arr 的排列:[1,2,3][1,3,2][3,1,2][2,3,1] 。

整数数组的 下一个排列 是指其整数的下一个字典序更大的排列。更正式地,如果数组的所有排列根据其字典顺序从小到大排列在一个容器中,那么数组的 下一个排列 就是在这个有序容器中排在它后面的那个排列。如果不存在下一个更大的排列,那么这个数组必须重排为字典序最小的排列(即,其元素按升序排列)。

  • 例如,arr = [1,2,3] 的下一个排列是 [1,3,2] 。
  • 类似地,arr = [2,3,1] 的下一个排列是 [3,1,2] 。
  • 而 arr = [3,2,1] 的下一个排列是 [1,2,3] ,因为 [3,2,1] 不存在一个字典序更大的排列。

给你一个整数数组 nums ,找出 nums 的下一个排列。

必须 原地 修改,只允许使用额外常数空间。

 

示例 1:

输入:nums = [1,2,3]
输出:[1,3,2]

示例 2:

输入:nums = [3,2,1]
输出:[1,2,3]

示例 3:

输入:nums = [1,1,5]
输出:[1,5,1]

 

class Solution {
public:
    void nextPermutation(vector<int>& nums) {
        // 从数组的倒数第二个元素开始向前查找
        // 找到第一个位置 i,满足 nums[i] < nums[i + 1],
        // 即从右往左找到的第一个升序对
        int i = nums.size() - 2;
        while (i >= 0 && nums[i] >= nums[i + 1]) {
            i--; // 如果当前元素不小于后一个元素,继续向前移动指针
        }

        // 如果找到了这样的位置 i(即 i >= 0)
        if (i >= 0) {
            // 从数组的末尾开始,找到第一个比 nums[i] 大的元素,位置为 j
            int j = nums.size() - 1;
            while (j >= 0 && nums[i] >= nums[j]) {
                j--; // 如果 nums[j] 不大于 nums[i],继续向前移动指针
            }
            // 交换 nums[i] 和 nums[j]
            swap(nums[i], nums[j]);
        }

        // 将 i 之后(包括 i + 1)的所有元素反转,使其变成最小的排列
        reverse(nums.begin() + i + 1, nums.end());
    }
};

 

标签:arr,排列,nums,一个,元素,数组
From: https://www.cnblogs.com/yueshengd/p/18664771

相关文章

  • 【AIGC-ChatGPT进阶提示词指令】命运之轮:一个融合神秘与智慧的对话系统设计
    引言在人工智能与用户交互的发展历程中,如何创造一个既能提供实质性帮助,又能带来独特体验的对话系统,一直是一个充满挑战的课题。本文将介绍一个别具一格的对话系统设计——“命运之轮”,它通过将传统的塔罗牌占卜元素与现代技术完美结合,创造出一种新颖的人机交互体验。提......
  • 详解 C++ 防御性编程声明一个类型 int *(*(*foo)(int))[5];
    C++中有一些语法由于灵活性和强大功能显得非常复杂。例如,复杂声明是许多人在学习C++时遇到的难题之一。下面以一条常被称为“C++最难的声明”为例,逐步拆解它的含义。声明:int*(*(*foo)(int))[5];这是一个看似复杂的C++声明。让我们逐步分析它的含义。1.阅读......
  • 探秘山海云端API:一个宝藏接口平台的前世今生
    初探山海云端API:一个低调且实用的接口工具站......
  • WPF 怎么利用behavior优雅的给一个Datagrid添加一个全选的功能
    前言:我在迁移旧项目代码的时候发现别人写很多界面都涉及到一个DataGrid的全选,但是每个都写的很混乱,现在刚好空闲下来,写一个博客,给部分可能不太会写这个的同学讲一下,怎么实现全选功能,并且可以在任何项目里面复用这个功能。先准备一个Datagrid,我们给这个DataGrid取名为dg1。......
  • 模拟ic入门——设计一个压控振荡器(VCO)(一)环形振荡器
    概述:振荡器是微电子不可或缺的一环,应用场景从微处理器的时钟到蜂窝电路的载波合成,要求的结构和性能差别很大。OSC主要分两部分,环形振荡器(RingOSC)和LC振荡器。其中环形振荡器主要由反相器构成,应用于低速的数字时钟中;而LC振荡器一般用于高频场景,如PLL参考资料:拉扎维的《模拟C......
  • 【Java开发】面对一个访问量比较高的API,我们应该如何去应对突然暴涨的流量呢?
    一、流量管理与限流1.流量限制和速率限制:例如,当请求频率超过预设阈值时,系统可以自动限制或拒绝额外的请求,从而保护后端服务免受过多请求的影响。通过API网关或负载均衡器进行配置,以控制每个用户或IP的请求速率。2.使用限流算法:令牌桶算法:适合应对瞬时突发流量,同时维持长期......
  • 从职高到高职:一个小角色的竞赛成长故事
    文章目录文墨的成长历程记录从职高生到高职,勇敢踏上改变的道路大一:迷茫与挣扎,从零开始第一次比赛:从挑战中积累经验,侥幸获得省三第二次比赛:技术进步,全面发挥作用,荣获省二大三:带领团队,突破自我,斩获省一总结:从迷茫到自信,从迷失到坚定文墨的成长历程记录从职高生到高职,......
  • 一个适用于 .NET 的开源整洁架构项目模板
    前言项目架构模式在软件开发中扮演着至关重要的角色,它们为开发者提供了一套组织和管理代码的指导原则,以提高软件的可维护性、可扩展性、可重用性和可测试性。今天大姚给大家分享一个适用于.NET的开源整洁架构项目模板。.NET常见的几种项目架构模式https://mp.weixin.qq.com/s......
  • 龙哥量化:文华8程序化名词解释WH8程序化交易:支持一开一平的信号过滤模型,也支持多次开仓
    如果您需要代写技术指标公式,请联系我。龙哥QQ:591438821龙哥微信:Long622889也可以把您的通达信,文华技术指标改成TB交易开拓者、金字塔、文华8的自动交易量化策略WH8程序化交易:支持一开一平的信号过滤模型,也支持多次开仓多次平仓的加减仓模型;支持一根K线一个信号的模型,也支持一......
  • 排列组合
    一、递推法求组合数——模板题AcWing885.求组合数I//c[a][b]表示从a个苹果中选b个的方案数for(inti=0;i<N;i++)for(intj=0;j<=i;j++)if(!j)c[i][j]=1;elsec[i][j]=(c[i-1][j]+c[i-1][j-1])%mod;二、通过预处理逆元的方式求组......