實現獲取下乙個排列的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。
如果不存在下乙個更大的排列,則將數字重新排列成最小的排列(即公升序排列)。
必須原地修改,只允許使用額外常數空間。
以下是一些例子,輸入位於左側列,其相應輸出位於右側列。
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1
思路:題目大意就是找該陣列的所有排列順序中,字典序比給定順序大1的順序,若已是最大字典序,則返回最小字典序
何為最大字典序?就是所有數字降序排列
何為最小字典序?就是所有數字公升序排列
對於特定排序順序,怎樣找下乙個字典序呢?
如下:對於任意字典序,由後向前找到第一對正序對記為(i, j),此時j以及j後的序列是乙個逆序列,想要找下乙個字典序,那麼一定是將i後邊比i大的最小數字與i交換;
如:1,2,5,4,3;第乙個正序對為(2, 5),2與3交換後得:1,3,5,4,2;
此時5,4,2並不是最小字典序,由此序列為降序,直接逆序,得1,3,2,4,5;即為所求序列;
可以看出上述方法共分三步:
由後向前找到第乙個正序對(i, j);
i後比i大的最小數與i交換;
將i後的序列(是降序)逆序(也即改為公升序);
不難發現2,3步可以顛倒順序,且不影響結果
之所以顛倒順序是因為將降序序列改為公升序之後,找比i大的最小數字就是i之後第乙個比i大的數字;
**如下:
class solution
//cout << i << endl;
for(int j=i, k=nums.size()-1; jnums[i-1])
}return;
}};
LeetCode 下乙個排列
實現獲取下乙個排列的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。如果不存在下乙個更大的排列,則將數字重新排列成最小的排列 即公升序排列 必須原地修改,只允許使用額外常數空間。以下是一些例子,輸入位於左側列,其相應輸出位於右側列。1,2,3 1,3,2 3,2,1 1,2,3 1...
leetcode 下乙個排列
題目 31.下乙個排列 實現獲取下乙個排列的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。如果不存在下乙個更大的排列,則將數字重新排列成最小的排列 即公升序排列 必須原地修改,只允許使用額外常數空間。以下是一些例子,輸入位於左側列,其相應輸出位於右側列。1,2,3 1,3,2 3...
LeetCode 下乙個排列(31)
實現獲取下乙個排列的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。如果不存在下乙個更大的排列,則將數字重新排列成最小的排列 即公升序排列 必須原地修改,只允許使用額外常數空間。以下是一些例子,輸入位於左側列,其相應輸出位於右側列。1,2,3 1,3,2 3,2,1 1,2,3 1...