描述
给定一个整数数组来表示排列,找出其上一个排列。
排列中可能包含重复的整数
样例
给出排列[1,3,2,3]
,其上一个排列是[1,2,3,3]
给出排列[1,2,3,4]
,其上一个排列是[4,3,2,1]
思路:
做这一题时,我们可以先回顾下求下一个排列,https://blog.csdn.net/u012156116/article/details/80704719
理解了上一题,这一题就很好做了:
同样的例子: 6, 8, 7, 4, 3, 2 ------> 7, 2, 3, 4, 6, 8
现在我们已知 7, 2, 3, 4, 6, 8
算法过程如下:
1. 先从后往前找到 i 位置 小于 i-1 位置的数,
2. 从 i 位置到末尾 逆置
3. 从i-1位置向右找到第一个小于 i-1位置 的数, 此数位置为 j
4. 交换 i-1 和 j 。
Java实现代码:
public List<Integer> previousPermuation(List<Integer> nums) {
// write your code here
int len = nums.size();
if(nums == null || len==0 || len==1){
return nums;
}
int i = len-1;
for (; i > 0; i--) {
if(i>0 && nums.get(i)<nums.get(i-1)){
break;
}
}
int pre = i, last = len-1;
while (pre<last){
int temp = nums.get(pre);
nums.set(pre, nums.get(last));
nums.set(last, temp);
pre++;
last--;
}
if(i>0){
// 从i-1 向后找第一个小于我的数
int j = i;
for(;j<len;j++){
if(nums.get(j)<nums.get(i-1)){break;}
}
// 交换 i-1 , j
int temp = nums.get(i-1);
nums.set(i-1, nums.get(j));
nums.set(j, temp);
}
return nums;
}