LeetCode 31. 下一個排列(Next Permutation)
阿新 • • 發佈:2018-06-16
必須 begin 一個 ID size void TE http TP
題目描述
實現獲取下一個排列的函數,算法需要將給定數字序列重新排列成字典序中下一個更大的排列。
如果不存在下一個更大的排列,則將數字重新排列成最小的排列(即升序排列)。
必須原地修改,只允許使用額外常數空間。
以下是一些例子,輸入位於左側列,其相應輸出位於右側列。
1,2,3
→ 1,3,2
3,2,1
→ 1,2,3
1,1,5
→ 1,5,1
解題思路
由於各個排列按照字典序排序,所以以 1,3,2
→ 2,1,3為例,
尋找下一個排列的步驟是:
- 首先找到從後往前第一個升序數對,在此例中即(1,3)
- 然後在升序對前一個數後面的數組中,從後往前找到第一個比升序對前一個數大的數,並將其與升序對前一個數交換,在此例中即找到2比1大,所以將2與1交換得到2,3,1
- 最後將交換後的數組從升序對後一個數開始按升序排序,在此例中即從3開始按升序排序得到2,1,3
在第一步中,若遍歷到數組頭部仍未找到升序對,說明不存在下一個更大的排列,則將數字重新排列成最小的排列(即升序排列)。
代碼
1 class Solution { 2 public: 3 void nextPermutation(vector<int>& nums) { 4 for(int i = nums.size() - 1; i >= 0; i--){ 5 if(i == 0) 6 sort(nums.begin(), nums.end());7 else if(nums[i] > nums[i - 1]){ 8 int minIdx = nums.size() - 1; 9 while(nums[i - 1] >= nums[minIdx]) 10 minIdx--; 11 swap(nums[minIdx], nums[i - 1]); 12 sort(nums.begin() + i, nums.end()); 13 break; 14 } 15 } 16 } 17 };
LeetCode 31. 下一個排列(Next Permutation)