Given a list of integers, which denote a permutation.
Find the previous permutation in ascending order.
The list may contains duplicate integers.
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]
從右往左掃,找到一個增長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;
}