【CT】LeetCode手撕—31. 下一个排列

devtools/2024/9/24 12:50:52/

目录

  • 题目
  • 1- 思路
  • 2- 实现
    • ⭐31. 下一个排列——题解思路
  • 3- ACM 实现


题目

  • 原题连接:31. 下一个排列

1- 思路

思路

  • ① 从右边找出一个尽可能大的数,和左边的数进行交换 ——> 交换后得到的数 就是 字典序更高
  • ② 字典序高,但不代表其就是下一个 ——> 如何找下一个?
    • 左边的小数,尽可能靠右
    • 右边的大数,尽可能的小(比左边的小数大一点点)

目标

  • ① 找到数组的拐点 ——> 从右向左遍历 ——> nums[i] < nums[i+1] 则找到了拐点 i+1
  • ② 找到拐点右侧第一个 nums[i] 大的元素,此时记录 为 j ——> 从右向左遍历
  • ③ 将元素 i 和 元素 j 交换,之后 sort(i+1,len-1)
  • ④ 如果不存在拐点,此时直接 reverse 整个数组

image.png


2- 实现

⭐31. 下一个排列——题解思路

在这里插入图片描述

java">class Solution {public void nextPermutation(int[] nums) {int len = nums.length-1;int i = len-1,j;// 1. 找拐点for(; i>=0 ;i--){if(nums[i] < nums[i+1]) break;}// 最大序列直接 reverseif(i==-1){int L = 0;int R = len;while(L<=R){swap(nums,L++,R--);}return;}// 2. 有拐点for( j = len; j>=i+1 ; j--){if(nums[j] > nums[i]) break;}swap(nums,i,j);// 实现 Reverseint L = i+1;int R = len;while(L<=R){swap(nums,L++,R--);}return;}public void swap(int[] nums,int i ,int j){int tmp = nums[i];nums[i] = nums[j];nums[j] = tmp;}
}

3- ACM 实现

java">public class nextPL {public static void nextPL(int[] nums){// 1.找拐点,从右往左int len = nums.length-1;int i ,j;for( i = len-1 ; i >= 0 ; i--){if(nums[i] < nums[i+1]) break;}if(i==-1){int L = 0;int R = len;while(L<=R){swap(nums,L++,R--);}return;}// 2. 找第一个小值for(j = len;j>=i+1;j--){if(nums[j] > nums[i]) break;}// 3. 先交换swap(nums,i,j);// 4. reverseint L = i+1;int R  = len;while(L<=R){swap(nums,L++,R--);}return;}// 定义 swap 函数public static void swap(int[] nums,int i ,int j){int tmp = nums[i];nums[i] = nums[j];nums[j] = tmp;}public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.println("输入数组长度");int n = sc.nextInt();int[] nums = new int[n];for(int i = 0;  i < n; i++){nums[i] = sc.nextInt();}nextPL(nums);System.out.println("下一个排列是");for(int i : nums){System.out.print(i+" ");}}
}


http://www.ppmy.cn/devtools/58104.html

相关文章

C++:继承

✨✨✨学习的道路很枯燥&#xff0c;希望我们能并肩走下来! 文章目录 目录 文章目录 前言 一.继承的概念及定义 1.1 继承的概念 1.2 继承定义 1.2.1 定义格式 1.2.2 继承关系和访问限定符 1.2.3 继承基类成员访问方式的变化 二.基类和派生类对象赋值转换 三.继承中的…

代码随想录训练第十一天|二叉树基础理论、二叉树递归遍历、二叉树迭代遍历、二叉树统一迭代法、LeetCode102.二叉树层序遍历

文章目录 二叉树理论基础二叉树种类满二叉树完全二叉树二叉搜索树平衡二叉搜索树 二叉树存储方式二叉树遍历方式二叉树的定义总结 二叉树的递归遍历思路前序遍历后序遍历中序遍历 二叉树的迭代遍历思路前序遍历&#xff08;迭代法&#xff09;中序遍历&#xff08;迭代法&#…

opencv 鱼眼图像的矫正(动态参数调整)

一&#xff1a;棋盘校准参数说明(内参) 棋盘校准的方法及代码很多&#xff0c;参见其他连接 1&#xff1a;内参矩阵 2&#xff1a;畸变系数 针对鱼眼相机此处是4个参数&#xff0c;在其校准代码中也可以知道&#xff0c;其通常的定义如下&#xff1a; data.camera_mat np.e…

【基础算法总结】分治—归并

分治—归并 1.排序数组2.交易逆序对的总数3.计算右侧小于当前元素的个数4.翻转对 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#x1f603; 1.排序数组 …

LVS+keepalived群集

在这个高度信息化的 IT时代&#xff0c;企业的生产系统、业务运营、销售和支持&#xff0c;以及日常管理等环节越来越依赖于计算机信息和服务&#xff0c;对高可用(HA)技术的应用需求不断提高&#xff0c;以便提供持续的、不间断的计算机系统或网络服务。 本文将学习如…

【计算机】同步/异步

同步/异步 在计算机科学和编程中&#xff0c;“同步”&#xff08;Synchronization&#xff09;是一种机制&#xff0c;用于协调不同进程或线程之间的操作&#xff0c;以避免竞态条件&#xff08;race conditions&#xff09;、死锁&#xff08;deadlocks&#xff09;和其他并…

域名、网页、HTTP概述

目录 域名 概念 域名空间结构 域名注册 网页 概念 网站 主页 域名 HTTP URL URN URI HTML 超链接 发布 HTML HTML的结构 静态网页 特点 动态网页 特点 Web HTTP HTTP方法 GET方法 POST方法 HTTP状态码 生产环境下常见的HTTP状态码 域名 概念 IP地…

事件总线使用

创建一个eventBus.js import { reactive } from vue// 创建一个响应式的事件对象用于存储事件处理器 const eventBus reactive({})// 添加事件监听器的函数 function on(eventName, handler) {if (!eventBus[eventName]) {eventBus[eventName] []}eventBus[eventName].push(…