leetcode 下一個排列
阿新 • • 發佈:2018-12-13
一,題目描述:
實現獲取下一個排列的函式,演算法需要將給定數字序列重新排列成字典序中下一個更大的排列。
如果不存在下一個更大的排列,則將數字重新排列成最小的排列(即升序排列)。
必須原地修改,只允許使用額外常數空間。
以下是一些例子,輸入位於左側列,其相應輸出位於右側列。1,2,3
→ 1,3,2
3,2,1
→ 1,2,3
1,1,5
→ 1,5,1
二,解題思路:
參考思路:網上看來一個示例,覺得挺好的,也沒必要另外找一個了。
6 5 4 8 7 5 1
一開始沒看對方的後面介紹,就自己在想這個排列的下一個排列是怎樣的。首先肯定從後面開始看,1和5調換了沒有用。
7、5和1調換了也沒有效果,因此而發現了8、7、5、1是遞減的。
如果想要找到下一個排列,找到遞增的位置是關鍵。
因為在這裡才可以使其增長得更大。
於是找到了4,顯而易見4過了是5而不是8或者7更不是1。
因此就需要找出比4大但在這些大數裡面最小的值,並將其兩者調換。
那麼整個排列就成了:6 5 5 8 7 4 1
然而最後一步將後面的8 7 4 1做一個遞增。
三,C++程式碼:
class Solution { public: void nextPermutation(vector<int> &num) { int index = num.size() - 1; while (num[index - 1] >= num[index]){ // 逆序則繼續 index--; } if (index == 0){ // 整個陣列都是逆序的 sort(num.begin(), num.end()); return; } // 找到第一個大於,此時4的索引是index-1 for (int i = num.size() - 1; i >= index; i--){ if (num[i] > num[index - 1]){ swap(num[i], num[index - 1]); break; } } sort(num.begin() + index, num.end()); // 再將後面的數從小到大排序 return; } };