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

31. 下一个排列 Golang实现

时间:2024-09-18 15:49:12浏览次数:9  
标签:arr 排列 nums 一个 31 Golang 数组 字典

题目描述:

整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。
例如,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 的下一个排列。
必须 原地 修改,只允许使用额外常数空间。

题目分析:

  • 输入: 数组
  • 输出:比当前排列大的一个数组
  • 要求:原地修改,并且只允许使用额外常数空间
    涉及到排列,就需要了解排列的规律。比如123,之后要找下一个排列就是找到第一个nums[i]<nums[i+1]的位置(需要从右到左进行找,第一个就是应该交换位置的地方,他们右侧都应该是增序的),找到应该换的数字后,找到右侧比他大的数的最小值,然后将他们进行交换位置,然后右侧的数字需要进行增序排列。由此可以找到下一个排列。
    例子:
    1,3,5,4,2的下一个排列:第一个nums[i]<nums[i+1]是3,5.说明下一个排列应该是将3替换掉,谁来替换呢?他的右侧的比他大的最小值4。交换位置后1,4,5,3,2.但是这个并不是比他大的紧邻的元素,应该对他右侧的元素进行排列。
点击查看代码
func nextPermutation(nums []int) {
    // Step 1: 从右往左,找到第一个 nums[i] < nums[i+1]
    i := len(nums) - 2
    for i >= 0 && nums[i] >= nums[i+1] {
        i--
    }

    // Step 2: 如果找到了这样的 i,找到 nums[i] 右侧比它大的最小元素,进行交换
    if i >= 0 {
        j := len(nums) - 1
        for nums[j] <= nums[i] {
            j--
        }
        nums[i], nums[j] = nums[j], nums[i]
    }

    // Step 3: 将 i 右侧的元素逆序
    sort.Ints(nums[i+1:])
}

标签:arr,排列,nums,一个,31,Golang,数组,字典
From: https://www.cnblogs.com/CharlseGo/p/18418674

相关文章

  • Golang代码导致cpu高的原因你知道吗????
    这段代码中出现高CPU使用率的原因主要是由于忙轮询(busy-waiting)问题。让我们仔细分析下这个问题:代码分析go复制代码select{casev:=<-ch://从通道接收到值vdefault://无数据可接收,走到default分支}casev:=<-ch:尝试从通道ch中接收数据。如果通道中有数......
  • 31263 / 32004 Game Development
    31263/32004GameDevelopmentLabWeek6GettingStarted1.Downloadthecorrespondingweek’szipfilefromthisweek’smoduleonCanvas.2.UnziptheprojectfolderandopenitinUnity.Ifthereareanywarningsaboutdifferenceinversions,justconti......
  • Leetcode 315. 计算右侧小于当前元素的个数
    1.题目基本信息1.1.题目描述给你一个整数数组nums,按要求返回一个新数组counts。数组counts有该性质:counts[i]的值是nums[i]右侧小于nums[i]的元素的数量。1.2.题目地址https://leetcode.cn/problems/count-of-smaller-numbers-after-self/description2.解题方法......
  • 26.删除有序数组中的重复项 Golang实现
    题目描述:给你一个非严格递增排列的数组nums,请你原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。元素的相对顺序应该保持一致。然后返回nums中唯一元素的个数。考虑nums的唯一元素的数量为k,你需要做以下事情确保你的题解可以被通过:更改......
  • 【数据结构与算法 | 灵神题单 | 自底向上DFS篇】力扣965, 2331, 100, 1379
    1.力扣965:单值二叉树1.1题目:如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。只有给定的树是单值二叉树时,才返回 true;否则返回 false。示例1:输入:[1,1,1,1,1,null,1]输出:true示例2:输入:[2,2,2,5,2]输出:false提示:给定树的节点数范围是 [1,......
  • 蓝桥杯-STM32G431RBT6(串口)
    前言一、配置二、使用步骤1.串口发送代码逻辑效果展示2.串口接收单个字符代码逻辑中断回调函数3.串口接受字符串代码逻辑字符串函数中断回调函数声明代码开源前言一、配置二、使用步骤1.串口发送代码逻辑sprintf(tx_buf,"jinke\r\n"):这行代码使用......
  • 蓝桥杯—STM32G431RBT6按键的多方式使用(包含软件消抖方法精讲)从原理层面到实际应用(一)
    新建工程教程见http://t.csdnimg.cn/JySLg点亮LED教程见http://t.csdnimg.cn/Urlj5末尾含所有代码目录按键原理图一、按键使用需要解决的问题1.抖动   1.什么是抖动   2.抖动类型   3.如何去消除抖动FIRST.延时函数消抖(缺点:浪费CPU资源)SECOND.中......
  • 程序修改题(31-40)
    第三十一题题目给定程序modi1.c中,函数fun的功能是:逐个比较p、q所指两个字符串对应位置中的字符,把ASCII值大或相等的字符依次存放到c所指数组中,形成一个新的字符串。例如,若主函数中a字符串为:aBCDeFgH主函数中b字符串为:ABcd则c中的字符串应为:aBcdeFgH。#include<st......
  • 列表与克隆体专题 scratch 20240916_182231
    体验克隆体变量scratch20240916_153936_鲸鱼编程pyhui的技术博客_51CTO博客https://blog.51cto.com/u_13137233/12031738数据的容器列表scratch20240916_155811_鲸鱼编程pyhui的技术博客_51CTO博客https://blog.51cto.com/u_13137233/12031757多组列表共同表达同一数据sc......
  • 图:310.最小高度数, 题解
    310.最小高度树-力扣(LeetCode)参考题解:算法逻辑:算法的核心思路是逐层剪去叶子节点,直到剩下的节点是最小高度树的根。示例:假设有如下的树结构:0/\12/\34初始时,叶子节点是1、3和4,剪掉这些叶子节点后,树变成:0\2再次剪掉......