题目:
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
思路:所谓一个排列的下一个排列的意思就是,在这一个排列和下一个排列之间没有其他的排列。这就要求我们这一个排列和下一个排列拥有尽可能长的共同前缀,也即变化限制在尽可能短的后缀上。
举个例子:
比如序列,7 8 6 9 8 7 2; 7 8 7 9 8 6 2; 7 8 7 2 6 8 9;
//找到i-1之后第一个大于num[i-1]的数字,并交换 int j = n - 1; while(num[i] >= num[j]) j--; swap(num[i], num[j]);2.由于j是第一个大于i的元素,所以交换后,ii开始到末尾,仍然满足递减顺序,直接reverse得到递增排列。注意是从ii开始翻转。
//交换后,仍然是降序排列。 reverse(num.begin() + ii, num.end());3. 简单记忆步骤
class Solution { public: void nextPermutation(vector<int> &num) { int n = num.size(); if(n == 1) return; for(int i = n-2, ii = n-1; i >= 0; i--, ii--) { //找到第一组相邻的降序组合 if(num[i] < num[ii]) { //找到i-1之后第一个大于num[i-1]的数字,并交换 int j = n - 1; while(num[i] >= num[j]) j--; swap(num[i], num[j]); //交换后,仍然是降序排列。 reverse(num.begin() + ii, num.end()); return; } } //如果排列是递减有序的,翻转整个数组 reverse(num.begin(), num.end()); return; } };
[C++]LeetCode: 79 Next Permutation (下一个排列,常见面试题)
原文地址:http://blog.csdn.net/cinderella_niu/article/details/42525241