给定一个整数数组来表示排列,找出其上一个排列。
样例
给出排列[1,3,2,3],其上一个排列是[1,2,3,3]
给出排列[1,2,3,4],其上一个排列是[4,3,2,1]
注意
排列中可能包含重复的整数
思路
将整数数组a遍历,找到第一个a[i]>a[i+1]的位置,然后j=i,在while循环判断是否有a[j+1]>=a[i]的,找到记录j,然后交换a[i],a[j]。最后将i位置之后的数字倒叙,并将最终结果输出。
代码
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.junit.Test;
public class Solution{
public ArrayList<Integer> previousPermuation(ArrayList<Integer> nums) {
// write your code
if(null==nums||0==nums.size()) return null;
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+1;
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--;
}
}
@Test
public void test(){
Integer []a={1,3,2,2,2,5};
List<Integer> nlistArrayList=Arrays.asList(a);
ArrayList<Integer> numsArrayList=new ArrayList(nlistArrayList);
/*numsArrayList.add(0, 1);
numsArrayList.add(1, 3);
numsArrayList.add(2, 2);
numsArrayList.add(3, 4);
numsArrayList.add(4, 3);*/
ArrayList<Integer> aList=previousPermuation(numsArrayList);
System.out.println(Arrays.toString(aList.toArray()));
/* for (int i = 0; i < aList.size(); i++) {
System.out.println(aList.get(i));
}*/
}
}