题目:上一个排列
来源:互联网 发布:江南杨治的妻子 知乎 编辑:程序博客网 时间:2024/05/24 04:30
public class Solution { /** * @param nums: A list of integers * @return: A list of integers that's previous permuation */ public ArrayList<Integer> previousPermuation(ArrayList<Integer> nums) { // write your code if(null==nums||0==nums.size()) return null; ArrayList<Integer> res = new ArrayList<>(); int i = nums.size()-2; while(i>=0){ if(nums.get(i)>nums.get(i+1)){ break; }else{ i--; } } if(i>=0){ int j = i; while(j<nums.size()-1){ if(nums.get(j+1)>=nums.get(i)){ break; }else{ j++; } } //交换i,j的值 int tmp1 = nums.get(i); int tmp2 = nums.get(j); nums.set(i,tmp2); nums.set(j, tmp1); } //翻转剩下的i+1开始的 reverse(nums, i+1); return nums; } public void reverse(ArrayList<Integer> nums,int start){ int s = start; int e = nums.size()-1; while(s<e){ int tmp1 = nums.get(s); int tmp2 = nums.get(e); nums.set(s, tmp2); nums.set(e, tmp1); s++; e--; } }}
给定一个整数数组来表示排列,找出其上一个排列。
您在真实的面试中是否遇到过这个题?
Yes
样例
给出排列[1,3,2,3],其上一个排列是[1,2,3,3]
给出排列[1,2,3,4],其上一个排列是[4,3,2,1]
注意
排列中可能包含重复的整数
标签 Expand
相关题目 Expand
解题思路:
比如排列是(2,4,1,3,5,6),前一个排列是(2,3,6,5,4,1)。求解过程如下
1.从右往左找到第一个i,a[i]>a[i+1] ,上例中就是4,对应位置为1
下面分2种情况:
- 找到了i>0,
2.从i开始,从左往右找到a[j+1]>a[i] ,上例即为3,对应位置为3
3.交换数组中i,j中的值,数组为(2,3,1,4,5,6)
4.将数组中i+1后的数字翻转,数组既是(2,3,6,5,4,1)
- 没有找到,既是全部是递减的,比如123456,其直接翻转全部既是上一个排列
0 0
- 题目:上一个排列
- 上一个排列
- 上一个排列
- LinkCode 下一个排列、上一个排列
- lintcode-上一个排列
- 上一个排列-lintcode
- Lintcode 上一个排列
- lintcode(51)上一个排列
- LintCode 51 上一个排列
- Lintcode 上一个排列
- 上一个排列算法java
- lintcode--上一个排列
- soj上一个fuckable的题目
- C++ STL 上一个全排列 | 下一个全排列
- 题目:[NOIP2001]求先序排列
- 全排列的题目
- 题目1120:全排列
- 题目1120:全排列
- 生成伪随机整数
- poj 1847 Tram floyd
- openssl自签名证书生成与单双向验证
- Qt 插件篇
- c++:函数模板与函数包装器
- 题目:上一个排列
- UFLDL机器学习
- 黑马程序员----集合类(ArrayList)的学习整理
- hdu 1028
- NBUT 1452 Ezreal
- Netty与Reactor模式
- VB断点调试
- 【java】itoo项目实战之EJB中的RMI框架如何设计
- 剑指off-不能被继承的类