Lintcode - Previous Permutation

Given a list of integers, which denote a permutation.

Find the previous permutation in ascending order.

Note

The list may contains duplicate integers.

Example

For [1,3,2,3], the previous permutation is [1,2,3,3]

For [1,2,3,4], the previous permutation is [4,3,2,1]

思路:和next permutation完全一致的思路。

從右往左掃,找到一個增長pivot,這個大的數字就是即將被換掉的。從這個數字往右必然是一個遞增序列,往右掃,直到找到一個數比這個pivot小而且是所有右邊數字中最大的,然後交換pivot和該數字。

從大到小sort pivot右邊的數字,由於右邊序列是遞增的,我們只需交換左右指針來進行排序即可。

    public ArrayList<Integer> previousPermuation(ArrayList<Integer> nums) {
        int peakInd = nums.size()-1;
        while (peakInd > 0 && nums.get(peakInd-1) <= nums.get(peakInd)) {
            peakInd--;
        }
        peakInd--;
        if (peakInd >= 0) {
            int swapInd = peakInd+1;
            while (swapInd < nums.size() && nums.get(swapInd) < nums.get(peakInd)) {
                swapInd++;
            }
            swapInd--;
            int tmp = nums.get(swapInd);
            nums.set(swapInd, nums.get(peakInd));
            nums.set(peakInd, tmp);
        }
        int left = peakInd+1;
        int right = nums.size()-1;
        while (left < right) {
            int tmp = nums.get(left);
            nums.set(left, nums.get(right));
            nums.set(right, tmp);
            left++;
            right--;
        }
        return nums;
    }


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章