Implement next permutation, which rearranges numbers intothe lexicographically next greater permutation of numbers.
If such arrangement is not possible, it must rearrange itasthe lowest possible order (ie, sorted inascending order).
The replacement must be in-place, donot allocate extra memory.
Here are some examples. Inputs are inthe left-hand column and its corresponding outputs are intheright-hand column.
1,2,3 → 1,3,23,2,1 → 1,2,31,1,5 → 1,5,1
class Solution {
public:
void nextPermutation(vector<int>& nums) {
// 題目比較難懂,其實意圖很簡單,所謂 lexicographically 就是說將各個位上的數看成一個整體// 例如. 1,2,3 看成 123。3,2,1 看成 321. // eg. [6 ,5 ,4, 8, 7, 5, 1] => [6,5,5,1,4,7,8]// The replacement must be in-place, do not allocate extra memory. !!!// 解題思路:// 從後向前看,找到第一個不是遞增的數,記爲 p 例如例子中的 p = 4, 其index=2// 然後在[p-end] 的區間中,從後向前,找到第一個比 p 大的數,交換他們// 然後,對p後面的數,進行升序操作// 如果這樣的數 p 不存在,說明,當前序列已經是最後一個了,那麼整體調整序列即可if (nums.empty() || nums.size() == 1) return;
if (nums.size() == 2) {
int i = 0, j = 1;
nums[i] &= 0xFFFF;
nums[i] = nums[i] << 8;
nums[i] |= nums[j];
nums[j] = nums[i];
nums[i] &= 0xFF;
nums[j] = nums[j] >> 8;
return;
}
int idx = nums.size() - 1;
// 找第一個不是遞增的while (idx > 0 && nums[idx] <= nums[idx-1]) {
idx--;
}
if (idx == 0) {
int i = 0, j = nums.size() - 1;
while ( i < j) {
nums[i] &= 0xFFFF;
nums[i] = nums[i] << 8;
nums[i] |= nums[j];
nums[j] = nums[i];
nums[i] &= 0xFF;
nums[j] = nums[j] >> 8;
i++;
j--;
}
}
else {
// 從後向前,找到第一個比p大的數,交換int i = nums.size() - 1;
int j = idx - 1;
while (i >= idx) {
if (nums[i] > nums[j]) {
nums[i] &= 0xFFFF;
nums[i] = nums[i] << 8;
nums[i] |= nums[j];
nums[j] = nums[i];
nums[i] &= 0xFF;
nums[j] = nums[j] >> 8;
break;
}
i--;
}
// 對p後面的數進行升序操作for (int i = idx; i < nums.size() - 1; i++) {
int j = i+1;
while (j < nums.size()) {
if (nums[i] > nums[j]) {
nums[i] &= 0xFFFF;
nums[i] = nums[i] << 8;
nums[i] |= nums[j];
nums[j] = nums[i];
nums[i] &= 0xFF;
nums[j] = nums[j] >> 8;
}
j++;
}
}
}
}
};