下一个排列-力扣31-java

news2025/2/28 13:00:22

一、题目描述

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

例如,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]

来源:力扣(LeetCode)

链接:https://leetcode.cn/problems/next-permutation

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、运行结果

三、解题思路

首先从后往前找到第一个减小的数字,记录其下标为index,如1357642,找到的数字是5,重点:该数字后面的所有数字是按从大到小排列的。如果不是,则表示在该数字之后还出现过减小的数字,那么当前数字就是不是倒序第一个减小的,矛盾。

如果没有找到减小的数字,就表示每一位数字都是按降序排列的,没有下一个更大的序列,逆置该数组返回即可。

如果找到了index,则从该下标往后找到比nums[index]大,而且是这数中最小的,如上面的数字找到的是6,然后交换5和6的位置,则数组变为1367542,index后面的数字仍是降序排列(7542),将index后面的所有数字变为升序排列(最小的排列)即可,此时数字变为1362457,即是下一个更大的排列。

四、AC代码

class Solution {
    public void nextPermutation(int[] nums) {
        int len = nums.length;
        int index = -1;
        for(int i=len-2; i>=0; i--){  //从后往前找到第一个下降的数字下标
            if(nums[i] < nums[i+1]){
                index = i;
                break;
            }
        }
        if(index == -1){  //不存在下一个更大的排列
            int i=0, j = len-1;
            while(i < j) {  //重新排列成最小的排列
                swap(nums, i, j);
                i++; j--; 
            }
            return ;
        }
        int i = index;
        //寻找后面比该数字大的最小数字下标
        while(i < len-1 && nums[i+1] > nums[index]) i++;  
        swap(nums, i, index);  //交换两个位置的元素
        int j=index+1, k = len-1;
        while(j < k){  //将该数字后面的数排成最小序列(逆置)
            swap(nums, j, k);
            j++; k--;
        }
    }
    private void swap(int[] nums, int i, int j){
        int tmp = nums[i];
        nums[i] = nums[j];
        nums[j] = tmp;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

记一次20撸240的沙雕威胁情报提交(2019年老文)

0x01 起因 这是一篇沙雕文章&#xff0c;没什么技术含量&#xff0c;大家娱乐一下就好 前几个月&#xff0c;我的弟弟突然QQ给我发来了一条消息&#xff0c;说要买个QQ飞车的cdk&#xff0c;我作为一个通情达理的好哥哥&#xff0c;自然不好意思回绝&#xff0c;直接叫他发来…

跟着团子学SAP PSS: 如何实现物质在不同法规下的准入管理(配置篇)

全球各地针对化学品的监管出台了很多法规&#xff0c;有相当一部分的法规都是输入准入制&#xff1a;只有在法规中列示的化学物质在当地才具有适销性&#xff0c;未列示的物质只有在一些特殊条件下才能销售。加拿大的DSL&#xff08;加拿大本国物质清单&#xff09;&#xff0c…

【Python入门第九天】Python 字符串

字符串字面量 python 中的字符串字面量由单引号或双引号括起。 ‘hello’ 等同于 “hello”。 可以使用 print() 函数显示字符串字面量&#xff1a; 实例 print("Hello") print(Hello)运行实例 用字符串向变量赋值 通过使用变量名称后跟等号和字符串&#xff0…

yolov3-tiny模型转trt的一个实例

感谢作者分享&#xff0c;仓库地址&#xff1a;https://github.com/zombie0117/yolov3-tiny-onnx-TensorRT?tdsourcetags_pcqq_aiomsg该仓库的代码没有使用现有的神经网络框架&#xff0c;如pytorch&#xff0c;tensorflow等&#xff0c;因此环境搭建相对比较容易。仓库作者是…

Docker逃逸

文章目录原理环境搭建Docker 环境判断Docker 容器逃逸特权模式逃逸如何判断是否为特权模式逃逸docker.sock挂载逃逸逃逸Remote API未授权访问未授权访问逃逸容器服务缺陷逃逸影响版本环境搭建逃逸脏牛漏洞逃逸参考原理 docker其实就是一个linux下的进程&#xff0c;它通过Name…

RV1126笔记二十八:RKNN上部署OCR测试

若该文为原创文章,转载请注明原文出处。 本篇文章只是记录下测试OCR的效果,想了解全过程,参考: 【工程部署】手把手教你在RKNN上部署OCR服务(上)_opencv rknn_ocr_三叔家的猫的博客-CSDN博客 【工程部署】手把手教你在RKNN上部署OCR服务(下)_三叔家的猫的博客-CSDN博…

ROS2中使用gazebo仿真时找不到libgazebo_ros_openni_kinect.so

因为ros2的gazebo_ros_pkgs中&#xff0c;已经将该插件移除&#xff0c;或者说将该插件的功能合并到libgazebo_ros_camera.so中&#xff0c; 这里是作者的说明。 合并后&#xff0c;深度相机的用法参考这里。 主要是将type改成depth。还有其他类型的相机&#xff0c;可以参考具…

如何优雅的实现回调函数?

本篇文章又是一期优雅的代码编程介绍———回调函数。 传统的nodejs编程都是这样的 const fs require(fs) fs.readFile(test.txt,utf8, function(err, dataStr){if(err){} }) 嵌套层级如果多了就成回调地狱了。如果我们将这种风格的代码转换成这样呢&#xff1f; const fs …

Word论文排版(1)样式设定

前言&#xff1a;现在很多学校都有 LaTeX 模板了&#xff0c;但是也有很多渣渣学校/学院没提供&#xff0c;而且要求必须提供 Word 版本的大论文&#xff01;那就只能从 Word 下手了。 Requirements Windows11、Word2016 样式设定 为什么要设置&#xff1a;和 LaTeX 一样&am…

MobaXterm详细使用教程

这一篇MobaXterm详细使用教程&#xff0c;我们来介绍一下如何设置并用MobaXterm来连接Linux服务器。MobaXterm 又名 MobaXVT&#xff0c;是一款增强型终端、X 服务器和 Unix 命令集(GNU/ Cygwin)工具箱。MobaXterm 可以开启多个终端视窗&#xff0c;以最新的 X 服务器为基础的 …

【笔试强训】Day_01

目录 一、选择题 1、 2、 3、 4、 5、 6、 7、 8、 9、 10、 二、编程题 1、组队竞赛 2、删除公共字符 一、选择题 1、 以下for循环的执行次数是&#xff08;&#xff09; for(int x 0, y 0; (y 123) && (x < 4); x); A 、是无限循环 B 、循环次…

从零开始学C

以下是 该如何学习C语言的【思维导图】以及部分重点知识点的【博客链接】。其实C语言并不难&#xff0c;难的是没有人去教&#xff0c;没有耐心去学。不知道从哪下手学习&#xff0c;我将C的知识点做成一个思维导图&#xff0c;以供迷茫的小白参考&#xff0c;哪里不会&#xf…

快速且有效减小代码包的方法

前言当我们在发布一些APP或者小程序等比较小的程序时候&#xff0c;常常会对其主包大小进行一定的规定&#xff0c;若超过推荐的主包大小则性能会被大大影响&#xff0c;或者再严重一点就不给你过审。如微信小程序中也对主包有一定的大小要求。对此一些比较复杂的小程序就需要考…

【机器学习】P1 Cost Function

Cost Functione.g.e.g.e.g. 假设你想要卖一个房子&#xff0c;希望可以用人工智能来算出能卖多少钱。机器学习可以根据提供的数据集合构建出很多模型&#xff0c;但是到底哪种模型最好的拟合你的数据&#xff1f;或者说&#xff0c;哪种模型可以最准确的算出你的卖多少钱&#…

TikTok曝高危漏洞允许一键式帐户劫持,回应称已修复

据The Verge 8月31日消息&#xff0c; TikTok安卓版存在一个高危漏洞&#xff0c;攻击者可能借此实现一键式账户劫持&#xff0c;影响数亿用户 。 微软365防御研究小组在一篇博文中披露了该漏洞的细节&#xff0c; 影响范围为23.7.3之前的安卓版本 。在微软向TikTok报告后&…

如何用 JavaScript 编写你的第一个单元测试

前言 测试代码是使代码安全的第一步。做到这一点的最好方法之一是使用单元测试&#xff0c;确保应用程序中的每个小功能都能发挥其应有的作用–特别是当应用程序处于边缘情况&#xff0c;比如无效的输入&#xff0c;或有潜在危害的输入。 为什么要单元测试 说到单元测试&…

测试开发之Django实战示例 第十章 创建在线教育平台

第十章 创建在线教育平台在上一章&#xff0c;我们为电商网站项目添加了国际化功能&#xff0c;还创建了优惠码和商品推荐系统。在本章&#xff0c;会建立一个新的项目&#xff1a;一个在线教育平台&#xff0c;并创内容管理系统CMS&#xff08;Content Management System&…

OSI模型详解

今天&#xff0c;我们详解OSI&#xff08;Open System Inter-connection Reference Model&#xff09;模型&#xff0c;来看看工业物联网的网络互联和数据互通。 OSI模型 1984年&#xff0c;国际标准化组织&#xff08;International Organization for Standardization&#…

C控制语句(continue,break)

一.continue 3种循环都可以使用continue语句。执行到该语句时&#xff0c;会跳过本次迭代的剩余部分&#xff0c;并开始下一轮迭代 for(count0;count<10;count) { ch getchar(); If(ch \n) continue; putchar(ch&#xff09;&#xff1b; } 这条代码当中当ch等于\…

MySQL CAST()函数用法

一、语法 expr&#xff1a;源数据&#xff0c;如字符串’China’。type&#xff1a;目标数据类型&#xff0c;例如CHAR。 cast(expr AS type)二、命令说明 将任何类型的值转换为具有指定类型的值。 CAST()函数通常用于返回具有指定类型的值&#xff0c;以便在WHERE&#xff…