下一个排列(Leetcode31)解读
本题代码来自Leetcode官方,个人对其理解后,生成自己的注解,以便更好的让读者理解。如有侵权,立即删除!
public class Main31 {
public static void main(String[] args) {
int[] arr = new int[]{9, 5, 3, 1};
nextPermutation(arr);
}
/**
* 核心思想:给定一个降序则该序列没有可能有下一个更大的排列;
* 1.从给定数组的右侧扫描出第一个a[i-1]<a[i]; (违背了核心思想,所以处理)
* 2.对a[i-1]固定位置,从其右侧(从右到左)找出第一个比a[i-1]大的数字a[j];
* 3.交换a[i-1]和a[j]的值。此时a[i-1]位置是下一个更大元素的首位,也是未交换之前a[i-1]到右侧最后一位组成数的下一个比起大的数的首位;
* 4.将a[i-1]右侧重新排列为最小(升序,之前的降序);此时,构成的数是原数下一个比其大的数;
* @param nums
*/
public static void nextPermutation(int[] nums) {
int i = nums.length-1; //倒数第1个元素下标
while(i-1 >= 0 && nums[i] <= nums[i-1]){ /*确定nums[i-1]的位置,即nums[i-1]<nums[i],简化为确定i-1的位置*/
i--;
}
if(i-1 >= 0){ /*如果i位置还在数组中,即nums[i-1]<nums[i]*/ /*i不在数组的情况就是遇到了一降序数组,直接反转让其成一个最小数列*/
int j = nums.length-1; /*定位j到i的右侧区域的最右侧*/
while(j >= 0 && nums[j] <= nums[i-1]){ /*找到nums[j]第一次大于nums[i-1]的位置,此时要满足j也要在数组中(当然,j肯定在数组中)*/
j--; /*j停下来的位置就是第一次大于nums[i-1]的位置*/
}
swap(nums,i-1,j); /*交换nums[i-1],nums[j]的值*/
}
reverse(nums,i); /*反转i右侧的降序,转变为升序*/
}
private static void reverse(int[] nums, int start) {
int i = start;
int j = nums.length-1;
while (i < j){
swap(nums,i,j);
i++;
j--;
}
}
private static void swap(int[] nums, int i, int j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
下一个排列(Leetcode31)解读的更多相关文章
- [Swift]LeetCode31. 下一个排列 | Next Permutation
Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...
- leetcode31题:下一个排列
实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许使用额外常数空间. ...
- LeetCode31.下一个排列 JavaScript
实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许使用额外常数空间. ...
- [LeetCode] Next Permutation 下一个排列
Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...
- lintcode:next permutation下一个排列
题目 下一个排列 给定一个整数数组来表示排列,找出其之后的一个排列. 样例 给出排列[1,3,2,3],其下一个排列是[1,3,3,2] 给出排列[4,3,2,1],其下一个排列是[1,2,3,4] ...
- C++构造 下一个排列 的函数
今天围观刘汝佳神犇的白书发现了一个好用的函数: next_permutation(); 可以用于可重, 或者不可重集, 寻找下一个排列. 时间复杂度尚不明. //适用于不可重和可重集的排列. # in ...
- LinkCode 下一个排列、上一个排列
http://www.lintcode.com/zh-cn/problem/next-permutation-ii/# 原题 给定一个若干整数的排列,给出按正数大小进行字典序从小到大排序后的下一个排列 ...
- Next Permutation 下一个排列
Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...
- LeetCode(31): 下一个排列
Medium! 题目描述: (请仔细读题) 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列) ...
- 【LeetCode每天一题】Next Permutation(下一个排列)
Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...
随机推荐
- C#使用LitJson解析Json数据
//接受MQ服务器返回的值 private void jieshou(string zhiling, string can1, string can2, string can3, string can ...
- 值得花费一周研究的算法 -- KMP算法(indexOf)
KMP算法是由三个科学家(kmp分别是他们名字的首字母)创造出来的一种字符串匹配算法. 所解决的问题: 求文本字符串text内寻找第一次出现字符串s的下标,若未出现返回-1. 例如 text : &q ...
- Java 8原生API也可以开发响应式代码?
前段时间工作上比较忙,这篇文章一直没来得及写,本文是阅读<Java8实战>的时候,了解到Java 8里已经提供了一个异步非阻塞的接口(CompletableFuture),可以实现简单的响 ...
- 2月9日 《Java 8实战》读后感
第一部分 基础知识 第3章 Lambda表达式 使用函数式接口 Predicate Consumer Function 第二部分 函数式数据处理 第4章 引入流 第5章 使用流 第6章 用流收集数据 ...
- [原创实践]redhat linux 5.3搭建Nexus
1:下载安装JDK,配置好环境变量(JAVA_HOME等) 下载linux下64位的jdk-7u45-linux-x64.tar.gz(百度网盘下载,官网的jdk-7u51-linux-x64.tar ...
- SpringBoot 内部方法调用,事务不起作用的原因及解决办法
在做业务开发时,遇到了一个事务不起作用的问题.大概流程是这样的,方法内部的定时任务调用了一个带事务的方法,失败后事务没有回滚.查阅资料后,问题得到解决,记录下来分享给大家. 场景 我在这里模拟一个场景 ...
- mysql------explain工具
基于mysql5.7,innodb存储引擎 使用explain关键字可以模拟优化器执行SQL语句,分析你的查询语句或是结构的性能瓶颈 在 select 语句之前增加 explain 关键字,MySQL ...
- maven出现:Failed to execute goal on project ...: Could not resolve dependencies for project ...
项目结构是一个父项目,多个子项目目录: 例如: common --------------(父项目) fristDemo ------------(子项目) 如果在子项目中调用了父项目,而对(子 ...
- k好数(动态规划)
问题描述 如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数.求L位K进制数中K好数的数目.例如K = 4,L = 2的时候,所有K好数为11.13.20.22 ...
- .net core 微服务项目-介绍篇
项目介绍 1.各种方式连接API都会连接到 APIGateway 来进行统一的分发 Ocelot 2.当api需要授权时 需要请求授权服务 IdentityServer4 3.授权服务对请求进行调用u ...