1. 程式人生 > >LeetCode 31. 下一個排列(Next Permutation)

LeetCode 31. 下一個排列(Next Permutation)

必須 begin 一個 ID size void TE http TP

題目描述

實現獲取下一個排列的函數,算法需要將給定數字序列重新排列成字典序中下一個更大的排列。

如果不存在下一個更大的排列,則將數字重新排列成最小的排列(即升序排列)。

必須原地修改,只允許使用額外常數空間。

以下是一些例子,輸入位於左側列,其相應輸出位於右側列。
1,2,31,3,2
3,2,11,2,3
1,1,51,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)