Next Permutation 求下一个排序@LeetCode

【经典算法】LeetCode31. 下一个排列(Java/C/Python3/GO实现含注释说明,中等) 方式优点缺点时间复杂度空间复杂度方式一原数组操作,只使用额外常量空间代码实现相对复杂O(n)O(1)方式二代码简洁,利用了内置函数违反了题目要求的原数组操作和常量空间限制O(n log n)O(n) 阅读详情

完全没有思路,参考了 http://www.cnblogs.com/etcow/archive/2012/10/02/2710083.html

分三步:

  1. 从后往前找falling edge,下降沿。(下降之后的那个元素)

  2. 从下降沿开始往后找出替换它的元素。(就是第一个比它小的前一个元素)

  3. 反转后面所有元素,让他从小到大sorted(因为之前是从大到小sorted的)

  例如 “547532“

  1. “547532”, 4是下降沿。

  2. “547532”, 5是要替换的元素, 替换后得到 “ 557432”

     3. "557432",   7432反转,得到 “552347”。



package Level4;

/**
 * Next Permutation
 * 
 *  Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers.

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

The replacement must be in-place, do not allocate extra memory.

Here are some examples. Inputs are in the left-hand column and its corresponding outputs are in the right-hand column.
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1
 *
 */
public class S31 {

	public static void main(String[] args) {

	}
	
	public void nextPermutation(int[] num) {
        if(num.length <= 1){
        	return;
        }
        
        // 1. 从后往前找falling edge,下降沿。(下降之后的那个元素)
        int edge = -1;
        for(int i=num.length-2; i>=0; i--){
        	if(num[i] < num[i+1]){
        		edge = i;
        		break;
        	}
        }
        
        if(edge > -1){
        	// 2. 从下降沿开始往后找出替换它的元素。(就是第一个比它小的前一个元素)
        	for(int i=edge+1; i<num.length; i++){
        		if(num[edge] >= num[i]){
        			nextPermutationSwap(num, edge, i-1);
        			break;
        		}
        		if(i == num.length-1){
        			nextPermutationSwap(num, edge, i);
        			break;
        		}
        	}
        }
        
        // 3. 反转后面所有元素,让他从小到大sorted(因为之前是从大到小sorted的)
        for(int i=edge+1, j=num.length-1; i<=edge+(num.length-edge-1)/2; i++, j--){
        	nextPermutationSwap(num, i, j);
        }
        
    }
	
	public void nextPermutationSwap(int[] num, int i, int j){
		int tmp = num[i];
		num[i] = num[j];
		num[j] = tmp;
	}

}


关于Win11安装Ubuntu子系统报错:WslRegisterDistribution failed with error 解决办法 Win11安装Ubuntu子系统报错:WslRegisterDistribution failed with error 阅读详情

相关推荐

【Labview与SQL Server互联(labview可以引用数据库)】

Labview与SQL Server互联

Magize的博客 3585

(LeetCode)下一个排列

题目要求看完题目可能一头雾水,什么是字典序数?什么又是下一个排列,很多读者连题目都没看懂。不急本篇的讲解现在开始题目理解以及思路分析(一) 先来搞懂题目,搞懂了题目就已经成功了一半了。就拿1 2 3 这个序数来讲解吧其按照从小到大的顺序排列的顺序为:可以发现什么规律? 1.全数升序排列是最小的,全数逆序排列是最大的 2.第一个数字越大其字典序越大 3.后面的数字升序排列比逆序排列小这些是我们通过这个例子能找到的规律,但是对我们解决这道题目有什

简十三的博客 2547

计算机网络-自顶向下方法 第三章课后习题答案(第七版)

复习题 R1. a) 就叫这个协议为简单传输协议STP(Simple Transport Protocol)。在发送方,STP从发送进程接收不超过1196字节的数据块、目标主机地址和目标端口号。STP向每个块添加一个4字节的头,并将目标进程的端口号放在头中。STP然后将目标主机地址和结果段提供给网络层。网络层将段交付给目的地主机的STP。目的主机基于STP检查段中的端口号,从段中提取数据,并将数据传递给由端口号标识的进程。 b) 在发送方,STP从发送进程接收不超过1192字节的数据块、目标主机地址和目标端

Erekilu的博客 2万+

LeetCode-下一个排列

(一)题目描述 实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列(即,组合出下一个更大的整数)。 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。 必须 原地 修改,只允许使用额外常数空间。 (二)解题思路 1、思路重点:如何保证下一排列是大于当前排列的最小排列? (1)动的元素越靠后越好,所以需从后向前查找 (2)前面被动的元素增幅越小越好 2、思路如下: (1)从后向前查找第一个相邻的升序对,下标分别为i(前)、j(后)(此

jaaccck的博客 894

Ta-Lib源码解析(三):蜡烛图指标 (Candlestick Indicator) #(附Python重构代码和示意图)(补充中)

蜡烛图指标为识别K线形态的指标,笔者认为重点在于定义方式所提供的思路,背后的投资逻辑可以借鉴但不建议直接参考文档的翻译内容和源码逻辑存在不一致的现象,笔者分别列出中文百科中的定义和源码实际逻辑,供大家参考技术分析理论中的一些模糊词,ta-lib中给出了精确的定义源码

量化就是探索生活 3254

S32K系列之PDB框图详解及PDB触发ADC

可编程延迟模块PDB,PDB可提供从内部或外部触发或可编程间隔信号到ADC硬件触发输入的可控制延迟。 PDB可以选择提供脉冲输出,用作CMP块中的采样窗口。 S32K系列的PDB资源如下表: PDB功能框图 在下图中,以下字母表示的意义: N:PDB通道的总数 n:PDB通道号,范围从0到N-1 M:每个PDB通道的总可用预触发 m:预触发编号,范围从0到M-1 Y:脉冲输出的总数 y:脉冲数...

zz56z56的博客 1万+

【LeetCode 题解】算法:31.下一个排列

确定替换元素:如果找到了符合条件的i,就在nums[i + 1]到数组末尾的范围内,找到一个最小的nums[j],且满足nums[j] > nums[i]。反转右侧:对nums[i + 1]到数组末尾的元素进行反转,因为此时这部分元素是降序的,反转后变为升序,可得到最小的排列。因此,时间复杂度为​O(n),其中n是数组的长度。

小高的博客 610

基于Ultralytic实现多路摄像头目标检测

基于Ultralytic实现多路摄像头目标检测前面的文章分享了单路摄像头画面的YOLO目标检测,这篇文章主要分享一下多路摄像头画面的实时YOLO目标检测。测试环境在Windows系统下进行。

qq_57674776的博客 941

LeetCode 31. 下一个排列(Next Permutation)

31. 下一个排列(Next Permutation) 31. 下一个排列(Next Permutation) 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。 必须原地修改,只允许使用额外常数空间。 以下是一些例子,输入位于左侧列,其相应输出位于右侧列。 1,2,3 → 1,...

墨1024 476

ADS中使用Momentum进行电源完整性分析示例

这个应用可以帮助工程师用更快的时间使用ADS Momentum完成PDN分析。该应用描述了利用ADS Momentum RF模拟器进行PDN分析的方法,大大缩短了计算时间。 该分析主要应用与高速数字设计。 在此应用中使用了以下ADS特性: ADS设计流程集成(ADFI)。 电磁协同仿真。 Momentum仿真。 仿真流程如下: 在Allegro中创建ADFI文件 要将Alleg...

zb6075_lb的专栏 7009

【2026年华为秋招(AI)-2月4日-第一题(100分)- 选择题】(题目+思路+Java&C++&Python解析+在线测试)

本文摘要:本文包含20道选择题,涵盖机器学习、线性代数、Transformer架构、概率统计等多个领域。题目涉及正交矩阵性质、Transformer注意力机制、聚类距离度量、ReAct框架、Softmax函数、混淆矩阵计算、Flash-Attention优化、位置编码、期望计算、归一化方法、矩阵迭代法、矩阵秩、大模型架构、神经网络推理、泊松流性质、SVM核函数以及聚类算法等知识点。每道题均提供解析,帮助理解核心概念和解题思路。

m0_73659489的博客 125

LeetCode_下一个排列

实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列(即,组合出下一个更大的整数)。 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。 必须 原地 修改,只允许使用额外常数空间。 示例 1: 输入:nums = [1,2,3] 输出:[1,3,2] 示例 2: 输入:nums = [3,2,1] 输出:[1,2,3] 示例 3: 输入:nums = [1,1,5] 输出:[1,5,1] 示例 4: 输入:nums = [1] 输出:[1] 一遍扫描法

959 488

调用魔搭API出现Please bind your Alibaba Cloud account before use的解决方案

本文主要介绍了调用魔搭API出现Please bind your Alibaba Cloud account before use解决方案,希望能对使用大模型的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 3万+

LeetCode下一个排列

LeetCode: Next Permutation 问题描述 A permutation of an array of integers is an arrangement of its members into a sequence or linear order. For example, for arr = [1,2,3], the following are considered permutations of arr: [1,2,3], [1,3,2], [3,1,2], [2,3,1].

weixin_44260108的博客 552

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

LeetCode - 下一个排列

下一个排列(LeetCode) 题目描述 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。 要求 必须原地修改,只允许使用额外常数空间。 以下是一些例子,输入位于左侧列,其相应输出位于右侧列。 1,2,3 → 1,3,2 3,2,1 → 1,2,3 1,1,5 → 1,5,1 思路 1、设置前后两个指针(java没有指针,可理解为两个下标标志位),一前一后,两层循环 2、前指针从数组的结尾倒数第二个

qq_34599349的博客 208

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

算法——LeetCode31. 下一个排列

31. 下一个排列 原题链接 题目:下一个排列 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。 必须原地修改,只允许使用额外常数空间。 以下是一些例子,输入位于左侧列,其相应输出位于右侧列。 1,2,3 → 1,3,2 3,2,1 → 1,2,3 1,1,5 → 1,5,1 题解1: 主要思路流程: 从后往前找相邻元素为升序的两个数,a[i],a[j],这时我们要替换的一个数为a[i],j之后的

知北行的博客 441

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

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

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

weixin_44382896的博客 574

LeetCode--31.下一个排列

那我们就将前面我们根本用不到的数给切掉,只考虑后面的数,那就新形成了一个数组嘛,我们就求这个数组的下一排列,是不是就简化了一下,反正求下一排列,前面那些权重比较大的数也动不得。当我们找到前面的数(p2)比后面的数(p1)小的那个位置的时候,我们就将前面的数(p2)依次与后面的所有的数(>=p1)相比较,找到一个最接近的数,与前面的数(p2)交换位置,再对。你可能有疑惑,是啊,我找出来了,但是,为什么要将前面的数(p2)与它后面的所有的数相比较,找出最接近它的数并且要比前面的数大呢?没有,也没关系,我会说。

dying_man的博客 1545

leetcode:31. 下一个排列

题目来源 leetcode 题目描述 题目解析 分析 我们可以将该问题形式化地描述为:给定若干个数字,将其组合为一个整数。如何将这些数字重新排列,以得到下一个更大的整数。如 123 下一个更大的数为 132。如果没有更大的整数,则输出最小的整数。 如何得到这样的排列顺序呢? 分析: 我们希望下一个数比当前数大,就需要将后面的[大数]和前面的[小数]交换,这样就能得到一个更大的数。比如 123456,将 5 和 6 交换就能得到一个更大的数 123465。 我们还需要下一个数增加的幅度尽可能的小,这

OceanStar的博客 441

LeetCode 31. 下一个排列

实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列(即,组合出下一个更大的整数)。 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。 必须 原地 修改,只允许使用额外常数空间。 示例 1: 输入:nums = [1,2,3] 输出:[1,3,2] 示例 2: 输入:nums = [3,2,1] 输出:[1,2,3] 示例 3: 输入:nums = [1,1,5] 输出:[1,5,1] 示例 4: 输入:nums = [1] 输出:

XY_xyz_xyz的博客 131

Leetcode刷题(第31题)——下一个排列

一、题目 二、案例 案例一: 输入:nums = [1,2,3] 输出:[1,3,2] 案例二: 输入:nums = [3,2,1] 输出:[1,2,3] 案例三: 输入:nums = [1,1,5] 输出:[1,5,1] 三、思路 由上述题目可知,如果给定数组为降序可知,其不存在最大值,此时我们需要将其降序排列。 如果不为降序数组,我们按照如下方法。这里我们以[3,2,4,1,6,4,0]为例。 1、首先我们应该从后向前遍历,找到第一个降序的值,在该数组中第一个降序的值为 1。 2、然后从后往前找

weixin_47450807的博客 595

LeetCode 31 Next Permutation (下一个排列)

一,问题描述 1 ,实现”下一个排列“函数,将排列中的数字重新排列成字典序列中的下一个更大的排列。如果这样的重新排列是不可能的,它必须重新排列成可能的最低顺序(即升序排序)   重排必须在原地,不分配额外的内存。   以下是一些示例,左侧是输入,右侧是输出:   [1 2 3] —>[1 3 2]   [3 2 1]—>[1 2 3]   [1 3 3]—->[3 1 3]   [1

wodedipang_的博客 707

当前排列的下一个排列(leetcode31)

package com.snnu;import java.util.Arrays;/** * Created by torch on 2017-06-02. */ public class Permutation { public void nextPermutation(int[] nums) { int len = nums.length; if(le

A Little Blog 547

Leetcode 31. 下一个排列

调用函数class Solution { public: void nextPermutation(vector<int>& nums) { next_permutation(nums.begin(), nums.end()); } };自己写class Solution { public: void nextPermutation(vector<int>&

Bendaai的博客 390

leetcode 下一个排列

//第一次解法错误正在重写

mmmmhello的博客 176

LeetCode 下一个排列

实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。必须原地修改,只允许使用额外常数空间。 以下是一些例子,输入位于左侧列,其相应输出位于右侧列。 1,2,3 → 1,3,2 3,2,1 → 1,2,3 1,1,5 → 1,5,1 class Solution { public: vo...

hestyle的博客 736
上一篇: Combination Sum II 无序数组中找组合(每个元素只能用一次)使得和为target@LeetCode@LeetCode
下一篇: Palindrome Partitioning 分割字符串为回文@LeetCode
chiiis
博客等级 码龄14年 422粉丝 429原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值