给定一个整数数组来表示排列,找出其之后的一个排列。
注意事项
排列中可能包含重复的整数
样例
********************************************************************************************
给出排列[1,3,2,3]
,其下一个排列是[1,3,3,2]
给出排列[4,3,2,1]
,其下一个排列是[1,2,3,4]
这问题类似于全排列问题,全排列问题有一种解法,叫字典序法。 参考 点击打开链接
题目意思是找,比给定序列大一点的最小序列。
步骤:
1.从右至左找第一个升序的两个元素。A[k]<A[k+1]
2.从右至k,找到第一个比A[k]大的元素A[i],交换A[k], A[k]的位置
3.反转k+1到最后的元素
vector<int> nextPermutation(vector<int> &nums) {
// write your code here
int p;
int i;
for(i=nums.size()-2;i>=0;i--){
if(nums[i]<nums[i+1]){
p=i;
break;
}
}
if(i<0){
sort(nums.begin(),nums.end());
return nums;
}
for(i=nums.size()-1;i>p;i--){
if(nums[i]>nums[p]){
swap(nums[i],nums[p]);
break;
}
}
reverse(nums.begin()+p+1,nums.end());
return nums;
}
*******************************************************************************************************
类似得到 上一个排列 的题目
vector<int> previousPermuation(vector<int> &nums) {
// write your code here
int p;
int i;
for(i=nums.size()-2;i>=0;i--){
if(nums[i]>nums[i+1]){
p=i;
break;
}
}
if(i<0){
sort(nums.begin(),nums.end());
reverse(nums.begin(),nums.end());
return nums;
}
for(i=nums.size()-1;i>p;i--){
if(nums[i]<nums[p]){
swap(nums[i],nums[p]);
break;
}
}
reverse(nums.begin()+p+1,nums.end());
return nums;
}