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,23,2,1 → 1,2,31,1,5 → 1,5,1
参考:https://www.cnblogs.com/grandyang/p/4428207.html
从后往前,找到第一个数a,该数比它后面那个数小。然后从后开始,找到第一个比该数a大的数b,交换他们,并对交换前a 的位置后的所有元素按升序排列(由前面查找知道,这些元素是降序的,反转即可)。
这道题让我们求下一个排列顺序,有题目中给的例子可以看出来,如果给定数组是降序,则说明是全排列的最后一种情况,则下一个排列就是最初始情况,可以参见之前的博客Permutations 全排列。我们再来看下面一个例子,有如下的一个数组
1 2 7 4 3 1
下一个排列为:
1 3 1 2 4 7
那么是如何得到的呢,我们通过观察原数组可以发现,如果从末尾往前看,数字逐渐变大,到了2时才减小的,然后我们再从后往前找第一个比2大的数字,是3,那么我们交换2和3,再把此时3后面的所有数字转置一下即可,步骤如下:
1 2 7 4 3 1
1 2 7 4 3 1
1 3 7 4 2 1
1 3 1 2 4 7
这里还需要考虑数组是降序的情况。见代码。
代码如下:
class Solution {
public void nextPermutation(int[] nums) {
/**
从后往前,找到第一个数a,该数比它后面那个数小。然后从后开始,找到第一个比该数a大的数b,交换他们,并对交换前a 的位置后的所有元素按升序排列(由前面查找知道,这些元素是降序的,反转即可)。如,1 2 7 4 3 1下一个排列为:1 3 1 2 4 7,找到a=2,b=3,交换后并从7开始反转。
*/
if(nums.length<=1) return ;
int i=nums.length-1;
for(;i>=1;i--){
if(nums[i]>nums[i-1])
break;
}
//找出b的位置(第一个比a大的元素的位置)
//位置i-1就是a的位置,在该位置后面找
int j=nums.length-1;
//位置i-1就是a的位置,如果i=0,说明数组是降序的,全数组反转。否则从i开始反转。i=0时j=-1
if(i!=0){
for(;j>=i;j--){
if(nums[j]>nums[i-1])
break;
}
swap(nums,i-1,j);
}
reverse(nums,i);
}
public void swap(int[] nums,int k,int l){
int tmp=nums[k];
nums[k]=nums[l];
nums[l]=tmp;
}
public void reverse(int[] nums,int i){
for(int left=i,right=nums.length-1;left<right;left++,right--){
int tmp=nums[left];
nums[left]=nums[right];
nums[right]=tmp;
}
}
}
Next Permutation 下一个排列的更多相关文章
- [LeetCode] Next Permutation 下一个排列
Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...
- 【LeetCode每天一题】Next Permutation(下一个排列)
Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...
- [LeetCode] 31. 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] ...
- 031 Next Permutation 下一个排列
实现获取下一个排列函数,这个算法需要将数字重新排列成字典序中数字更大的排列.如果不存在更大的排列,则重新将数字排列成最小的排列(即升序排列).修改必须是原地的,不开辟额外的内存空间.这是一些例子,输入 ...
- [leetcode]31. Next Permutation下一个排列
Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...
- [Swift]LeetCode31. 下一个排列 | Next Permutation
Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...
- 力扣——Next Permutation(下一个排列) python实现
题目描述: 中文: 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许 ...
- Leetcode31--->Next Permutation(数字的下一个排列)
题目: 给定一个整数,存放在数组中,求出该整数的下一个排列(字典顺序):要求原地置换,且不能分配额外的内存 举例: 1,2,3 → 1,3,2: 3,2,1 → 1,2,3: 1,1,5 → 1, ...
随机推荐
- Ubuntu15.10下如何使用EasyGui模块开发Python GUI
偶然的一个机会,发现了github上的这个开源的项目,easygui for python(一个基于TKinter的模块) 感觉很是惊讶,原来python也可以这么简单的开发出一些GUI界面(究其原因 ...
- C++编译器对属性和方法的处理机制
C++中的class从面向对象理论出发,将变量(属性)和函数(方法)集中定义在一起,用于描述现实世界中的类.从计算机的角度,程序依然由数据段和代码段构成. C++编译器如何完成面向对象理论到计算机程序 ...
- Oracle EBS R12文件系统结构(学习汇总网上资料)
Oracle EBS R12在服务器端文件结构如下: 顶层目录下面分为 1)inst --–跟ebs整个实例(instance)相关的配置信息以及其他信息 2) db ---主要存储DB层的信息 ...
- (NO.00003)iOS游戏简单的机器人投射游戏成形记(十九)
如果看过前面博文的童鞋可能记得,我们在Level1中是通过写代码实现篮筐的走位.写代码不够直观,需要反复编译测试,有没有其他的方法呢? 答案自然是:大大的有 ;) SpriteBuilder宝贝自身已 ...
- HTML5 classList API接口
原文地址:HTML5 classList API 原文日期: 2010年07月13日 翻译日期: 2013年08月23日 当我陷入JavaScrip和JavaScript类库框架之中时,我总是有种希望 ...
- ios可视化编程 UI高级 UI_13
一.简单的说,IB Xib就是拖控件编程,也可以说是可视化编程(所见即所得),使用Xib编程,相对于纯代码,可以省下大量的敲代码时间,从而提高程序的开发时间,Xcode 4 之后才可以在工程中直接使 ...
- python的sys模块
Sys模块函数之多,我只能选取自己认为比较实用的一些函数列在此处.借马云找员工的说法,"找最合适的而不是最天才的",这句话,我个人觉得在很多方面都能适应,学习也不在话下.Sys模块 ...
- Leetcode_8_String to Integer
本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/41521063 Implement atoi to conv ...
- Android进程通信之一:两种序列化方式
2月下旬辞职了,去海南度假到现在,领略了一把三亚风情也算任性和 然而这样任性带来的后果就是..不行了我必须吐槽一句.. 没毕业的找工作就这么难嘛!投了57家一家面试机会都没有,好歹给个面试机会啊!!本 ...
- Rust语言
Rust语言 https://doc.rust-lang.org/stable/book/ http://www.phperz.com/article/15/0717/141560.html Rust ...