题目描述:
给定一个整数数组来表示排列,找出其之后的一个排列。
注意事项:
排列中可能包含重复的整数。
样例:
给出排列[1,3,2,3],其下一个排列是[1,3,3,2]
给出排列[4,3,2,1],其下一个排列是[1,2,3,4]
思路讲解:
我是从例子中找到规律的,例如:
5-2-4-3-1我们发现他的下一个排列是5-3-1-2-4
就是从后往前找到一个递减的 这里是2-4,所以我们只需要从4后面找到一个比2大的最小的数,这里是3,然后交换这两个数,并对4以后的数字(包括4)进行排序就好了。这里有一个特殊情况就是找不到递减的比如:5-4-3-2-1,这里我们直接排序就可以了。
代码详解:
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> res;
if(nums.size()==0)
{
return res;
}
int flag=-1;
for(int i=nums.size()-1;i>0;i--)
{
if(nums[i]>nums[i-1])
{
flag=i-1;
int changepos;
int min=INT_MAX;
for(int j=i;j<nums.size();j++)
{
if(nums[j]-nums[flag]>0)
{
if(nums[j]-nums[flag]<min)
{
min=nums[j]-nums[flag];
changepos=j;
}
}
}
int temp;
temp=nums[flag];
nums[flag]=nums[changepos];
nums[changepos]=temp;
sort(nums.begin()+flag+1,nums.end());
return nums;
}
}
sort(nums.begin(),nums.end());
return nums;
}
};
还有一个更简便的(C++ 中)有一个函数可以直接求数组的下一个排列
next_permutation( nums.begin(), nums.end() );