描述
给定一个整数数组来表示排列,找出其上一个排列。
排列中可能包含重复的整数
样例
给出排列[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; }