下一個排列(LeetCode)
題目連結
題目描述
實現獲取下一個排列的函式,演算法需要將給定數字序列重新排列成字典序中下一個更大的排列。
如果不存在下一個更大的排列,則將數字重新排列成最小的排列(即升序排列)。
必須原地修改,只允許使用額外常數空間。
以下是一些例子,輸入位於左側列,其相應輸出位於右側列。
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1
思路
我們需要將一個左邊的較小數與一個右邊的較大數交換,以能夠讓當前排列變大,從而得到下一個排列。
同時我們要讓這個較小數儘量靠右,而較大數儘可能小。當交換完成後,較大數右邊的數需要按照升序重新排列。這樣可以在保證新排列大於原來排列的情況下,使變大的幅度儘可能小。
程式碼如下:
class Solution {
public:
void nextPermutation(vector<int>& nums) {
int len=nums.size(),flag=0;
for(int i=len-1;i>=0;i--){
for(int j=len-1;j>i;j--){
//找到可以交換的
if(nums[i]<nums[j]){
swap(nums[i],nums[j]);
//較大數右邊的數按照升序重新排列
sort(nums.begin()+i+1,nums.end());
flag=1;
break;
}
}
if(flag)
break;
}
if(flag)
return;
//不存在更大排列,返回最小排列
sort(nums.begin(),nums.end());
return;
}
};
相關文章
- LeetCode31.下一個排列LeetCode
- LeetCode 31. 下一個排列 | PythonLeetCodePython
- 31. 下一個排列
- Leetcode——46. 全排列LeetCode
- leetcode:全排列(java回溯)LeetCodeJava
- LeetCode系列46—全排列LeetCode
- 【LeetCode】46. 全排列LeetCode
- LeetCode-046-全排列LeetCode
- [Leetcode]下一個更大元素IILeetCode
- LeetCode 567. 字串的排列LeetCode字串
- LeetCode-441-排列硬幣LeetCode
- LeetCode-047-全排列 IILeetCode
- Leetcode 496. 下一個更大元素 ILeetCode
- LeetCode-496-下一個更大元素 ILeetCode
- LeetCode 1470. 重新排列陣列LeetCode陣列
- LeetCode46 回溯演算法求全排列,這次是真全排列LeetCode演算法
- 【leetcode】60. Permutation Sequence 全排列的第k位序的排列形式LeetCode
- LeetCode 45跳躍遊戲&46全排列LeetCode遊戲
- LeetCode每日一題: 排列硬幣(No.441)LeetCode每日一題
- 全排列及相關擴充套件演算法(二)——求字典序下一組排列及全排列演算法套件演算法
- LeetCode刷題進階之重新排列字串(1528)LeetCode字串
- LeetCode-116-填充每個節點的下一個右側節點指標LeetCode指標
- LeetCode117-填充每個節點的下一個右側節點指標 IILeetCode指標
- LeetCode-117-填充每個節點的下一個右側節點指標 IILeetCode指標
- [連結串列]leetcode1019-連結串列中的下一個更大節點LeetCode
- 【leetcode 3149. 找出分數最低的排列】記憶化搜尋LeetCode
- leetcode 面試題08.08. 有重複字串的排列組合LeetCode面試題字串
- 實現將10個整數升序排列
- 逆序排列
- 求下一個大數
- 用js寫三個數,讓三個數從小到大排列JS
- 排列 題解
- 排列組合
- [MATLAB]排列大小Matlab
- 字串全排列字串
- 程式碼隨想錄演算法訓練營day29 | leetcode 491. 非遞減子序列、46. 全排列、47. 全排列 II演算法LeetCode
- linux下一個網路卡配置多個IPLinux
- python:用pyinstaller做個排列組合的小工具Python