原题网址:https://www.lintcode.com/problem/next-permutation/description
描述
给定一个整数数组来表示排列,找出其之后的一个排列。
排列中可能包含重复的整数
您在真实的面试中是否遇到过这个题?
样例
给出排列[1,3,2,3]
,其下一个排列是[1,3,3,2]
给出排列[4,3,2,1]
,其下一个排列是[1,2,3,4]
思路:如果做过全排列字典序,那么相较于上一个排列,下一个排列要容易理解一些。
1 首先,从右向左寻找递增序列的下一个位置(递增结束位置),即nums【i】<nums【i+1】,该位置为第一个变位。找到了,转2,否则返回翻转后的整个数组;
2 在 i+1~end 中从右向左寻找递增序列中第一个大于nums【i】的元素位置k,交换 t 与 k 处的元素;
3 翻转i+1 ~ end 部分的元素。
AC代码:
class Solution { public: /** * @param nums: A list of integers * @return: A list of integers */ vector<int> nextPermutation(vector<int> &nums) { // write your code here vector<int> result=nums; int n=nums.size(); int i=-1; for (int j=n-2;j>=0;j--) { if (result[j]<result[j+1]) { i=j; break; } } if (i!=-1) { int k; for (int j=n-1;j>i;j--) { if (result[j]>result[i]) { k=j; break; } } swap(result[i],result[k]); reverse(result.begin()+i+1,result.end()); } else { reverse(result.begin(),result.end()); } return result; } };