- 题目:
实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列(即,组合出下一个更大的整数)。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
2. 解题思路:我是按照leetcode官方的解题方法进行解的,自己尝试了几个解法都没ac就放弃了。官方的解题方法我觉得非常巧妙,从后往前找到nums中第一个比它后一个大的数,那么它的后一个数就是要被交换的,然后再从后往前找第一个比nums[i-1] 大的数与之交换,然后对nums[i]到nums.end()的数进行逆序(可以直接逆序的原因是这些数一定是从右至左递增的)就得到了下一个排列。
3. 解题代码:
class Solution {
public:
void nextPermutation(vector<int>& nums) {
//首先从后往前找到第一个nums[i] > nums[i-1]的数
//然后从i - nums.size() 中找到比nums[i+1]大 且 大的最少的数与之交换,然后对i - nums.size()-1 的范围由小到大排序
int i = nums.size() - 2;
while (i >= 0 && nums[i] >= nums[i + 1]) {
i--;
}
if (i >= 0) {
int j = nums.size() - 1;
while (j >= 0 && nums[i] >= nums[j]) {
j--;
}
swap(nums[i], nums[j]);
}
reverse(nums.begin() + i + 1, nums.end());
}
};
- tips:
reverse()函数是c++中新增的函数,作用是对vector中的方法进行反向的排序。