描述
实现next_permutation函数
解决
1.先从右往左遍历找到第一个非递增的数,记为val
,并且记下位置。如果从右往左遍历时发现数组是递增的,直接reverse整个数组,否则接着下一步
2.从右往左找第一个大于等于val
的数,记下位置
3.交换刚才记录的那两个位置
4.reverseval
右边的数
class Solution {
public:
void nextPermutation(vector<int>& nums) {
int length = nums.size();
int i = length - 1, j = 0;
int now_val = 0;
while (i >= 0)
{
if (i == 0 && nums[i] > nums[i + 1])
{
reverse(nums.begin(), nums.end());
return;
}
if (nums[i] <= nums[i - 1])
{
--i;
continue;
}
now_val = nums[i - 1];
j = i - 1;
break;
}
int k = 0;
i = length - 1;
int tar = 0;
// cout << j << endl;
while (i > j)
{
if (nums[i] <= now_val)
{
--i;
continue;
}
else if (nums[i] >= now_val)
{
tar = nums[i];
k = i;
break;
}
}
// cout << k << endl;
if (j >= 0) swap(nums[j], nums[k]);
reverse(&nums[j + 1], &nums[length]);
}
};