LeetCode刷题之HOT100之下一个排列

《百年孤独》看到了255页,还有100页就看完了,每个人物的一生就像流水,波澜不惊下是暗流涌动。值得一提的是外国小说对人性的描写更为深入,每个人物性格都被刻画的淋漓。是的,今天雨一直在下,淋湿我的身上,独自一人在偌大的会议室,不知所措。孤独与倦怠像洪水吞噬了我,残存的躯壳在这里机械的打着稍有点人情味的字,一切都令人感到无趣,孤独占有了我。可能是看了这本书的后遗症,也同样可能是我矫揉造作、无病呻吟,在为我拥有这种感受与情愫喝彩,认为孤独是小众,是高于其他,这一切都不无可能。

1、题目描述

在这里插入图片描述

2、逻辑分析

通过不了的植物大战僵尸杂交版,让我想起了来做LeetCoed,可当我看到这个题后,又感觉被僵尸吃掉了脑子。说实话,不太理解这个题目索要表述的到底是什么。看了题解后才知道,大致意思如下图:

在这里插入图片描述

怎么处理该题目呢?解法思路:

  1. 从右向左找到第一个相邻的元素对 (i, i+1),使得 nums[i] < nums[i+1]。这意味着在 i
    之前的元素(如果有的话)都已经是降序排列的,且 i 之后的元素(如果有的话)都小于或等于 nums[i]。
  2. 如果不存在这样的元素对(即 i 小于
    0),那么整个数组已经是降序排列的(即已经是最大的排列)。在这种情况下,我们将整个数组反转以得到最小的排列。
  3. 如果存在这样的元素对 (i, i+1),则从右向左找到第一个比 nums[i] 大的元素 nums[j],并将 nums[i] 和
    nums[j] 交换。这样可以确保 i 之后的元素尽可能小,且 i 之前的元素保持不变(因为它们已经是降序排列的)。
  4. 最后,将 i+1 之后的数组部分反转,以确保在交换了 nums[i] 之后,我们得到的排列是尽可能小的。

使用一个具体例子来佐证:

在这里插入图片描述

3、代码演示

 public void nextPermutation(int[] nums) {
        // 从右向左找到第一个相邻的元素对 (i, i+1),使得 nums[i] < nums[i+1]  
        // 这样的元素对意味着我们可以通过重新排列i之后的元素来得到一个更大的排列
        int i = nums.length - 2;
        while(i >= 0 && nums[i] >= nums[i + 1]){
            i--;
        }
        // 如果i小于0,说明整个数组是降序排列的(即已经是最大的排列)  
        // 这时候,我们需要将整个数组反转以得到最小的排列 
        if(i >= 0){
            // 从右向左找到第一个比nums[i]大的元素nums[j]  
            // 我们需要将nums[i]与nums[j]交换,这样可以确保交换后的nums[i]后面部分的元素尽可能小
            int j = nums.length -1;
            while(j >= 0 && nums[i] >= nums[j]){
                j--;
            }
            // 交换nums[i]和nums[j]  
            swap(nums, i , j);
        }
        / 将i+1之后的数组部分反转  
        // 这样做是为了确保在交换了nums[i]之后,我们得到的排列是尽可能小的
        reverse(nums, i + 1);
    }
    // 辅助函数:交换数组中的两个元素  
    public void swap(int[] nums, int i, int j){
        int temp = 0;
        temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }
    // 辅助函数:反转数组中从start开始到末尾的部分
    public void reverse(int []nums, int start){
        int left = start, right = nums.length -1;
        while(left < right){
            swap(nums, left, right);
            left++;
            right--;
        }
    }

时间复杂度:O(n),空间复杂度:O(1)。

刚开始看题解真的想放弃,后面慢慢一步步理清思路就感觉很轻松了。未知让人恐惧,舒适区就像温水煮青蛙,还是得适当跳脱出,去拉伸区转转,好了,题目就到这儿了,拜拜!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/668611.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

顶点着色技术在AI去衣中的作用

在当今的数字时代&#xff0c;人工智能&#xff08;AI&#xff09;已经渗透到我们生活的方方面面&#xff0c;从智能家居到自动驾驶汽车&#xff0c;再到在线购物推荐。然而&#xff0c;AI的影响远不止于此。近年来&#xff0c;AI在图像处理和计算机视觉领域的应用取得了显著进…

【Linux】在Windows环境下配置两台Linux机器的文件互传

相信有很多云服务器小伙伴都有想把一台linux资源传到另一台机器&#xff0c;那么该怎样实现&#xff1f; 本篇文章的演示案例都是基于centous进行传输&#xff0c;ubuntu进行接收&#xff01; 别的方法也都是一样的&#xff01; 方法一&#xff08;基于xshell进行的压缩包win…

实现JDBC编程

JDBC编程 JDBC —> java database connectivity 即java数据连接, 是执行sql语句的javaAPI(application programming interface),所谓的数据库是一类软件,就会提供对应的API,数据库有很多种,不同的数据库提供对应的API是不一样的,而这个API有java.sql.* 和 javax.sql.*包中的…

找不到msvcr100.dll如何修复,分享几种有效的修复方法

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“找不到msvcr100.dll”。这个错误通常发生在运行某些程序时&#xff0c;系统无法找到所需的动态链接库文件。这个问题可能会给用户带来困扰&#xff0c;但是幸运的是&#xff0c;有一些简单…

【常见的六大排序算法】插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序

个人主页 创作不易&#xff0c;感谢大家的关注&#xff01; 文章目录 前言 &#x1f3a1;一、插入排序&#x1f332;二、希尔排序&#x1f389;三、选择排序&#x1f380;四、冒泡排序&#x1f698;五、堆排序&#x1f6f5;六、快速排序1. Hoare版本2. 挖坑法3. 前后指针法4. 非…

【PPT】修改新建文本框默认字体

【PPT】修改新建文本框默认字体

图文并茂带你理解Java的代理模式

目录 Java的代理模式1、什么是代理模式&#xff1f;2、静态代理和动态代理3、JDK动态代理的局限性4、使用CGLIB代理机制完成未实现接口的类的代理5、JDK动态代理和CGLIB动态代理对比6、JDK动态代理为什么只能代理实现接口的类&#xff1f; Java的代理模式 1、什么是代理模式&a…

【Git】git合并分支指定内容到主分支

git合并分支指定内容到主分支 在现实开发中&#xff0c;往往需要合并分支内容&#xff0c;如下图&#xff1a; 我们平时在其他分支修改了部分代码&#xff0c;如何将分支部分代码合并到主分支上面呢&#xff1f; 合并步骤&#xff1a; 1、切换当前到主分支 git checkout m…

Java-----String类

1.String类的重要性 经过了C语言的学习&#xff0c;我们认识了字符串&#xff0c;但在C语言中&#xff0c;我们表示字符串进行操作的话需要通过字符指针或者字符数组&#xff0c;可以使用标准库中提供的一系列方法对字符串的内容进行操作&#xff0c;但这种表达和操作数据的方…

函数的创建和调用

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 提到函数&#xff0c;大家会想到数学函数吧&#xff0c;函数是数学最重要的一个模块&#xff0c;贯穿整个数学学习过程。在Python中&#xff0c;函数…

Flutter开发效率提升1000%,Flutter Quick教程之对组件进行拖拽与接收

1&#xff0c;首先&#xff0c;所有可以选择的组件&#xff0c;都在左边的组件面板里。从里面点击任何一个&#xff0c;按住左键&#xff0c;向右边的手机面板上进行拖拽即可。 2&#xff0c;拖拽后&#xff0c;我们要选择一个接收组件。什么时候可以接收组件&#xff0c;就是当…

小柴带你学AutoSar系列一、基础知识篇(4)编译

小柴带你学AutoSar总目录https://blog.csdn.net/qianshang52013/article/details/138140235?spm1001.2014.3001.5501 Flechazohttps://www.zhihu.com/people/jiu_sheng 编译真的很重要&#xff01;了解一下机器是如何工作的吧。当然啦&#xff01;通过学习这篇文章还可以学习…

【Go语言精进之路】构建高效Go程序:掌握变量、常量声明法则与iota在枚举中的奥秘

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 引言一、变量1.1 基础知识1.2 包级变量的声明形式深入解析&#x1f4cc; 声明并同时显式初始化&#x1f4cc; 声明但延迟初始化&#x1f4cc; 声明聚类与就近原则 1.3 局部变量的声明形式深入探讨&#x1f4cc; 延迟初始化的…

【原创教程】MES服务器与成品打标机控制说明

1 实现的功能及应用的场合 MES即制造执行系统(manufacturing execution system,简称MES),即在加强MRP计划的执行功能,把MRP计划同车间作业现场控制,通过执行系统联系起来。 MES是一个生产管理智能化的一个系统,是用于生产时记录数据、产量等信息的智能管理系统。 该项…

go语言基于Gin集成后台管理系统开发定时任务管理cron/v3好用又好看

系统目前是支持两种定时类型&#xff0c;一种是函数类型&#xff0c;一种是接口类型&#xff0c;来支持多样的业务&#xff1b;时间周期可视化选择&#xff0c;方便设定执行周期。框架UI漂亮&#xff0c;添加管理定时任务设置简单&#xff0c;客户都可以做自己调整执行时间周期…

LLC开关电源开发:第一节,LLC原理概述

第一节&#xff0c;LLC原理概述文章目录 一、LLC概述二、LLC电路拓扑1.电路拓扑2.电路工作原理3.电路原理分析 总结 一、LLC概述 LLC电路&#xff0c;是一种通过控制开关频率&#xff08;频率调节&#xff09;来实现输出电压恒定的谐振电路&#xff0c;它包括一个电感L、一个电…

transfomer中attention为什么要除以根号d_k

简介 得到矩阵 Q, K, V之后就可以计算出 Self-Attention 的输出了&#xff0c;计算的公式如下: A t t e n t i o n ( Q , K , V ) S o f t m a x ( Q K T d k ) V Attention(Q,K,V)Softmax(\frac{QK^T}{\sqrt{d_k}})V Attention(Q,K,V)Softmax(dk​ ​QKT​)V 好处 除以维…

算法每日一题(python,2024.05.31)

题目来源&#xff08;力扣. - 力扣&#xff08;LeetCode&#xff09;&#xff0c;简单&#xff09; 解题思路&#xff1a; 二次遍历&#xff0c;第一次遍历用哈希表记录每个字母的出现次数&#xff0c;出现一次则将它的value值赋为True&#xff0c;将它的下标赋为key值&#x…

leetcode74搜索二维矩阵

题目 给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target &#xff0c;如果 target 在矩阵中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 fa…

LeetCode-47 全排列Ⅱ

LeetCode-47 全排列Ⅱ 题目描述解题思路代码说明 题目描述 给定一个可包含重复数字的序列 nums &#xff0c;按任意顺序 返回所有不重复的全排列。 示例 &#xff1a; 输入&#xff1a;nums [1,1,2]输出&#xff1a; [[1,1,2], [1,2,1], [2,1,1]] b站题目解读讲的不好&…