Lintcode51:上一个排列

描述

给定一个整数数组来表示排列,找出其上一个排列。

排列中可能包含重复的整数

样例

给出排列[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;
    }




猜你喜欢

转载自blog.csdn.net/u012156116/article/details/80705592