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

31. 下一个排列

时间:2023-04-04 18:55:05浏览次数:32  
标签:arr 排列 nums 一个 31 len int 数组

题目描述

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

  • 例如,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 class Solution {
 2     // 思路: 1.从后往前遍历,找到第一个满足条件 nums[i] > nums[i - 1]。若不存在,则反转数组
 3     //       2.排序[i, length - 1]之间的元素
 4     //       3.从i开始往后找比nums[i]大的元素t,找到后swap(),交换 nums[i - 1] 和 元素t 即可
 5     //       nums[i - 1]相当于分割线
 6     public void nextPermutation(int[] nums) {
 7         int len = nums.length;
 8         int k = -1; // 记录分割节点索引
 9         for (int i = len - 1; i > 0; i--) {
10             if (nums[i] > nums[i - 1]) {
11                 k = i - 1;
12                 break;
13             }
14         }
15         if (k == -1) { // 若不存在,反转整个链表
16             reverse(nums, 0, len - 1); 
17             return;
18         }
19         // [k + 1, len]自然排序
20         Arrays.sort(nums, k + 1, len);
21         // 从k + 1处往后找比nums[k]大的元素并交换位置
22         for (int i = k + 1; i < len; i++) { 
23             if (nums[i] > nums[k]) {
24                 swap(nums, k, i);
25                 break;
26             }
27         }
28 
29     }
30     // 反转数组[i, j]之间的元素
31     void reverse(int[] nums, int i, int j) {
32         while (i < j) {
33             swap(nums, i, j);
34             i++;
35             j--;
36         }
37     }
38     // 交换nums[i], nums[j]两元素
39     void swap(int[] nums, int i, int j) {
40         int tem = nums[i];
41         nums[i] = nums[j];
42         nums[j] = tem;
43     }
44 }

标签:arr,排列,nums,一个,31,len,int,数组
From: https://www.cnblogs.com/yclblogs/p/17287635.html

相关文章

  • win10同步当前项目git的更新记录到另一个项目
    1.备份某个时间之后的更新文件列表到文件中gitlog--after="2023-4-318:27:44"--name-only--pretty=format:"">commit_files.txt2.根据文件中的记录复制文件到新的文件夹@echooffsetlocalenabledelayedexpansionsetinput_file=commit_files.txtsetoutput_fold......
  • flutter系列之:创建一个内嵌的navigation
    目录简介搭建主Navigator构建子路由总结简介我们在flutter中可以使用Navigator.push或者Navigator.pushNamed方法来向Navigator中添加不同的页面,从而达到页面调整的目的。一般情况下这样已经足够了,但是有时候我们有多个Navigator的情况下,上面的使用方式就不够用了。比如我们有一个......
  • 从零开始设计一个右键菜单组件
    需求分析首先要分析右键菜单需要实现什么功能点击鼠标右键弹出自定义的弹窗实现菜单项的点击自定义菜单项的样式自定义弹窗容器的样式代码实现需求搞定之后就是写代码了,下面是基础的代码框架<template><divclass="yak-content-menu"@contextmenu="showContentMenuFn"@click="......
  • dash-board的kube-config文件怎么设置 就是比kube-proxy类似多了一个token选项
    https://kubernetes.io/zh/docs/reference/access-authn-authz/rbac/#使用RBAC鉴权RBAC是基于角色的访问控制(Role-BasedAccessControl)https://kubernetes.io/zh/docs/reference/access-authn-authz/authorization/#鉴权概述1.1:在指定namespace创建账户:#kubectlcre......
  • 手把手带你通过API创建一个loT边缘应用
    摘要:使用APIArts&APIExplorer调用IoT边缘服务接口创建应用,了解边缘计算在物联网行业的应用。本文分享自华为云社区《使用APIArts&APIExplorer调用IoT边缘服务接口创建应用》,作者:华为IoT云服务。开始体验前需注册华为云账号并完成实名认证,实验过程中请使用Chrome浏览器完成相......
  • 阿西莫夫机器人 用 ChatGPT 开发一个能听懂人话的命令行工具
    小结:1、3种角色2、设立榜样ChatGPT会将整个聊天记录作为输入,因此我们可以通过提供一些“榜样”来让ChatGPT更好地理解我们的意图。这意味着我们可以在界面上将ASSISTANT原先错误的回答修改为正确的,也就是给出了正确回答的“好榜样”。   用ChatGPT开发一个能听......
  • 一个简单的rust项目贪吃蛇
    一个贪吃蛇游戏的rust实现,使用了piston_window和randcrate。游戏使用上下左右方向键进行操控,使用R重置游戏,使用P进行暂停/启动。项目结构·├──Cargo.lock├──Cargo.toml├──src/│  ├──main.rs│  ├──snake_game/│  │ ├─......
  • 白嫖一个月的ES,完成了与MySQL的联动
    前言《腾讯云xElasticsearch三周年》活动来了。文章写之前的思路是:在腾讯云服务器使用docker搭建ES。但是理想很丰满,显示很骨感,在操作过程中一波三折,最后还是含着泪美滋滋地,白嫖了一个月的腾讯云ES服务。最后就是利用腾讯云的Elasticsearch和Kibana,和我在腾讯云服务器上搭建M......
  • 一个.Net简单、易用的配置文件操作库
    在我们日常项目开发中,操作INI/CFG配置文件,往往会通过调用WinAPI来实现,WinAPI接口参数只支持字符串,而我们项目中,往往数据类型是多种多样的,在保存和获取配置值,我们就要进行类型的转换。今天给大家推荐一个操作库,这个库就可以解决我们的问题。项目简介这是一个基于.Net开发的简单......
  • 51nod 1370 排列与操作
    1370 排列与操作题目来源: TopCoder基准时间限制:2 秒空间限制:131072 KB分值: 320 难度:7级算法题 收藏 关注给定N长排列P,其中排列指数集{1,2,3...N}组成的一个序列,序列中每个元素恰好出现一次。初始时这个排列是给出的。之......