題目如下:
下一個排列
給定一個若干整數的排列,給出按正數大小進行字典序從小到大排序後的下一個排列。
如果沒有下一個排列,則輸出字典序最小的序列。
左邊是原始排列,右邊是對應的下一個排列。
1,2,3
→ 1,3,2
3,2,1
→ 1,2,3
1,1,5
→ 1,5,1
不允許使用額外的空間。
做題思路:
1、一開始沒有讀懂題意,其實意思是排列是這樣的,如果是123,下一個排列就是逐漸增大的,一次爲,123 132 213 231 312 321 如果是最後一個321,那麼下一個又回到123,循環着來;
2、從後往前尋找升序序列,當升序序列到末尾的時候,找到升序中第一個大於下一個數字的數,交換之後再將升序許列排序,例如:
原來序列是146521,從後往前找到升序序列是1256,下一個數是4,在升序序列中,5是第一個大於4的數,交換5和4,然後從第三個數直到最後開始排序,最後結果是151246.如果原本序列從頭到尾都是降序的,那麼直接排序處理即可。
具體的C++代碼如下:
class Solution {
public:
/**
* @param nums: a vector of integers
* @return: return nothing (void), do not return anything, modify nums in-place instead
*/
void nextPermutation(vector<int> &nums) {
// write your code here
int len=nums.size();
int i,j;
for(i=len-1;i>=0;i--)
{
for(j=len-1;j>i;j--)
{
if(nums[i]<nums[j])
{
swap(nums[i],nums[j]);
sort(nums.begin()+i+1,nums.end());
return;
}
}
}
sort(nums.begin(),nums.end());
}
};