题意
给一串数字,找到字典序中刚好比这一串数字大的一种新排列
思路
从后向前找,找到第一个后一位比前一位大的地方,然后把这个位置标为x,则找到x——num.end()中比nums[x-1]要大,并且最小的数字,与nums[x-1]交换,然后再把nums[x ~ nums.end()]排序即可。
时间复杂度:O(nlogn)
代码
class Solution {
public:
int findmin(vector<int>& arr, int left)
{
int tmp = INT_MAX, idx = -1, bound = arr[left-1];
for (int i = left; i < arr.size(); i++)
{
if (arr[i] > bound && arr[i] < tmp)
{
idx = i;
tmp = arr[i];
}
}
return idx;
}
void nextPermutation(vector<int>& nums) {
for (int i = nums.size() - 1; i >= 1; i--)
{
if (nums[i] > nums[i-1])
{
int idx = findmin(nums, i);
swap(nums[i-1], nums[idx]);
sort(nums.begin()+i, nums.end());
return ;
}
}
sort(nums.begin(), nums.end());
}
};