31 Next Permutation
这道题让我们求下一个排列顺序,有题目中给的例子可以看出来,如果给定数组是降序,则说明是全排列的最后一种情况,则下一个排列就是最初始情况。我们再来看下面一个例子,有如下的一个数组
1 2 7 4 3 1
下一个排列为:
1 3 1 2 4 7
那么是如何得到的呢,我们通过观察原数组可以发现,如果从末尾往前看,数字逐渐变大,到了2时才减小的,然后我们再从后往前找第一个比2大的数字,是3,那么我们交换2和3,再把此时3后面的所有数字转置一下即可,步骤如下:
1 2 7 4 3 1
1 2 7 4 3 1
1 3 7 4 2 1
1 3 1 2 4 7
代码:
class Solution {
public:
void nextPermutation(vector<int>& nums) {
if(nums.empty())
return;
int i;
for(i = nums.size()-1;i>0;i--)
if(nums[i-1]<nums[i])
break;
reverse(nums.begin()+i,nums.end());//先倒转
if(i==0)
return;
auto itr = upper_bound(nums.begin()+i, nums.end(), nums[i-1]);//二分查找优化查找效率
swap(nums[i-1], *itr);
return;
}
};