首页 > 其他分享 >【刷题笔记】31. Next Permutation

【刷题笔记】31. Next Permutation

时间:2023-09-01 22:31:57浏览次数:62  
标签:排列 nums int 31 Next Permutation Output Example 小数

题目

Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers.

If such an arrangement is not possible, it must rearrange it as the lowest possible order (i.e., sorted in ascending order).

The replacement must be in place and use only constant extra memory.

Example 1:

Input: nums = [1,2,3]
Output: [1,3,2]

Example 2:

Input: nums = [3,2,1]
Output: [1,2,3]

Example 3:

Input: nums = [1,1,5]
Output: [1,5,1]

Example 4:

Input: nums = [1]
Output: [1]

Constraints:

  • 1 <= nums.length <= 100
  • 0 <= nums[i] <= 100

题目大意

实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。必须 原地 修改,只允许使用额外常数空间。

解题思路

  • 题目有 3 个问题需要解决。如何找到下一个排列。不存在下一个排列的时候如何生成最小的排列。如何原地修改。先解决第一个问题,如何找到下一个排列。下一个排列是找到一个大于当前排序的字典序,且变大的幅度最小。那么只能将较小的数与较大数做一次原地交换。并且较小数的下标要尽量靠右,较大数也要尽可能小。原地交换以后,还需要将较大数右边的数按照升序重新排列。这样交换以后,才能生成下一个排列。以排列 [8,9,6,10,7,2] 为例:能找到的符合条件的一对「较小数」与「较大数」的组合为 6 与 7,满足「较小数」尽量靠右,而「较大数」尽可能小。当完成交换后排列变为 [8,9,7,10,6,2],此时我们可以重排「较小数」右边的序列,序列变为 [8,9,7,2,6,10]。
  • 第一步:在 nums[i] 中找到 i 使得 nums[i] < nums[i+1],此时较小数为 nums[i],并且 [i+1, n) 一定为下降区间。第二步:如果找到了这样的 i ,则在下降区间 [i+1, n) 中从后往前找到第一个 j ,使得 nums[i] < nums[j] ,此时较大数为 nums[j]。第三步,交换 nums[i]nums[j],此时区间 [i+1, n) 一定为降序区间。最后原地交换 [i+1, n) 区间内的元素,使其变为升序,无需对该区间进行排序。
  • 如果第一步找不到符合条件的下标 i,说明当前序列已经是一个最大的排列。那么应该直接执行第三步,生成最小的排列。

代码

package leetcode

func nextPermutation(nums []int) {
	i, j := 0, 0
	for i = len(nums) - 2; i >= 0; i-- {
		if nums[i] < nums[i+1] {
			break
		}
	}
	if i >= 0 {
		for j = len(nums) - 1; j > i; j-- {
			if nums[j] > nums[i] {
				break
			}
		}
		swap(&nums, i, j)
	}
	reverse(&nums, i+1, len(nums)-1)
}

func reverse(nums *[]int, i, j int) {
	for i < j {
		swap(nums, i, j)
		i++
		j--
	}
}

func swap(nums *[]int, i, j int) {
	(*nums)[i], (*nums)[j] = (*nums)[j], (*nums)[i]
}

标签:排列,nums,int,31,Next,Permutation,Output,Example,小数
From: https://blog.51cto.com/u_16110811/7327027

相关文章

  • KubeSphere 社区双周报 | KubeKey 新增网络插件 Hybridnet | 2023.08.18-08.31
    KubeSphere社区双周报主要整理展示新增的贡献者名单和证书、新增的讲师证书以及两周内提交过commit的贡献者,并对近期重要的PR进行解析,同时还包含了线上/线下活动和布道推广等一系列社区动态。本次双周报涵盖时间为:2023.08.18-2023.08.31。贡献者名单新晋KubeSphereCon......
  • AtCoder Beginner Contest 317 C - Remembering the Days
    C-RememberingtheDays原题链接题意:每个点最多经过一次,求最长路思路:数据范围很小,深搜每个点能到其他点的所有路,取最大#include<bits/stdc++.h>usingnamespacestd;constintN=110;intg[N][N];intn,m;boolst[N];intw=0;intans=0;voiddfs(intu){ st[......
  • AtCoder Beginner Contest 317
    A-Potions#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongintpower(intx,inty,intp){x%=p;intans=1;while(y){if(y&1)ans=ans*x%p;y>>=1,x=x*x%p;}......
  • 2023.8.31值得推荐的一款服务器空间
    ,已经体验一个月咯,非常不错的免费资源,适合大家去了解了解~!他们家的免费空间,免费服务器,非常稳定,非常靠谱,值得拥有,价格厚道~!免备案服务,域名管理等等服务,应有尽有,2023年你值得了解,他们家的免费云服务器还是独立IP的哦,非常非常好,非常NICE~!官网地址:https://www.sanfengyun.com......
  • 2023-08-31 js 判断内容有值才运行 ==》if (!!str) {//内容有值则运行}
    一般新手判断一个值是否不为null且不为undefined且不为空都会这样写str!=''&&str!=undefined&&str!=null或者str!==''&&typeof(str)!==undefined&&str!==null其实有一种简洁高效的写法就是2个!组成,即!!str。如:if(!!str){//内容......
  • 8.31
    “今天是8.31日呢……”“生日快乐,Miku,快来吃蛋糕吧。”她在荧光屏上静静地看着我。“啊,miku酱,吃不到呢。”“那我就全吃掉啦?”切下一块蛋糕,在未变的面容上寻找失落的情感。“骗你的啦,怎么可能独吞生日蛋糕的呢?”“我画给你吧?”“祝初音未来,16岁生日快乐!”“虽然已......
  • ; 简洁易用的电脑桌面时钟2023年8月31日
    ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@;简洁易用的电脑桌面时钟2023年8月31日;;#NoTrayIcon#SingleInstance,force;;一......
  • P4316 绿豆蛙的归宿
    原题这篇帖子主要解释为什么正推和倒推有区别,如果想询问做法,请移步至洛谷题解区倒推:\(dp_i\)表示从\(i\rightarrown\)的期望距离,\(deg_u\)表示\(u\)点出度\[dp_u=\sum_{(u,v,w)\inE}{\frac{dp_v+w}{deg_u}}\]正推:\(dp_i\)表示从\(1\rightarrowi\)的期望距离,\(g_i\)......
  • 在CentOS8下安装MySQL8.0.31
    一、登录官网主页:https://www.mysql.com/downloads/,选择社区版下载,如下图: 选择MySQLCommunityServer: 选择Archives: 按照下图步骤,获取下载的IP地址  最终拿到的官网地址为:https://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.31-1.el8.x86_64.rpm-bun......
  • 电动牙刷上架亚马逊美国站UL4131测试报告
    在我们的日常生活中,电动牙刷已经成为了许多人日常清洁牙齿的必备工具。然而,在将其推向市场的过程中,制造商们必须遵守一系列的法规和标准,以确保产品的安全性和质量。这其中就包括了我们今天要讨论的UL4131标准。UL4131标准是一款关于个人保健电器类的产品安全标准,它主要关注的是个人......