您的位置:首页 > 其它

题目:上一个排列

2015-08-22 23:25 363 查看

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,其直接翻转全部既是上一个排列
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: