Next Permutation

题目简单来说,就是给你一个序列,然后你要算出这个序列的下一个序列是什么,排序按照字典序。
这题的基本解题思想我是在这篇文章看到的:
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. 完成。

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

 class Solution {
public:
void nextPermutation(vector<int>& nums) {
int suffix = nums.size() -;
while(suffix > && nums[suffix] <= nums[suffix - ]){
suffix --;
}
if(suffix == ){
reverse(nums.begin(),nums.end());
return;
}
int pivot = suffix - ;
for(int i = nums.size()-; i >= ; i--){
if(nums[i] > nums[pivot]){
int temp = nums[pivot];
nums[pivot] = nums[i];
nums[i] = temp;
break;
}
}
reverse(begin(nums)+suffix,end(nums)); return;
}
};
05-12 09:54