下一个排列算法
这幅图足够了解下一排列算法的思路啦
class Solution
{
public:
int FindFirstPartionInd(const vector<int> &nums)
{
int size = nums.size();
int last = nums[size - 1];
for (int i = size - 2; i >= 0; --i)
{
if (nums[i] < last)
return i;
last = nums[i];
}
return -1;
}
int FindFirstLargerInd(const vector<int> &nums, int target)
{
int size = nums.size();
for (int i = size - 1; i >= 0; --i)
{
if (nums[i] > target)
return i;
}
return -1;
}
void nextPermutation(vector<int> &nums)
{
int size = nums.size();
if (size == 0 || size == 1)
return;
int partionInd = FindFirstPartionInd(nums);
if (partionInd == -1)
{
reverse(nums.begin(), nums.end());
return;
}
int largerInd = FindFirstLargerInd(nums, nums[partionInd]);
if (largerInd == -1)
{
reverse(nums.begin(), nums.end());
return;
}
swap(nums[partionInd], nums[largerInd]);
reverse(&nums[partionInd + 1], &nums[size]);
return;
}
};