[LeetCode] Next Permutation(一种巧妙的解题方法)

Next Permutation

Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers.
If such arrangement is not possible, it must rearrange it as the lowest possible order (ie, sorted in ascending order).
The replacement must be in-place, do not allocate extra memory.
Here are some examples. Inputs are in the left-hand column and its corresponding outputs are in the right-hand column.

1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1

题目简单来说,就是给你一个序列,然后你要算出这个序列的下一个序列是什么,排序按照字典序。
这题的基本解题思想我是在这篇文章看到的:
Next lexicographical permutation algorithm
下面简单的讲下我的理解,以[0,1,2,5,3,3,0]作为例子。

  1. 找到一个最长的非递增后缀suffix,如图所示的[5,3,3,0];
  2. 选择suffix前的数,设为pivot(橙色数字2);
  3. 从后缀suffix中找到大于pivot的数中的最小数(深蓝数字3);
  4. 交换第二步和第三步中的两个数;
  5. 将suffix倒置(相当于从小到大排序);
  6. 完成。

    图片名称

 1 class Solution {
 2 public:
 3     void nextPermutation(vector<int>& nums) {
 4         int suffix = nums.size() -1;
 5         while(suffix > 0 && nums[suffix] <= nums[suffix - 1]){
 6             suffix --;
 7         }
 8         if(suffix == 0){
 9             reverse(nums.begin(),nums.end());
10             return;
11         }
12         int pivot = suffix - 1;
13         for(int i = nums.size()-1; i >=0 ; i--){
14             if(nums[i] > nums[pivot]){
15                 int temp = nums[pivot];
16                 nums[pivot] = nums[i];
17                 nums[i] = temp;
18                 break;
19             }
20         }
21         reverse(begin(nums)+suffix,end(nums));
22 
23         return;
24     }
25 };

 

posted @ 2018-04-04 21:41  liangf27  阅读(170)  评论(0编辑  收藏  举报