题目链接:leetcode.
思路:找到一个尽量靠右的较小值,将它与自己右边的一个最小的较大值进行交换
并将较小值位置右边的数按从小到大排序
实际上,交换后,右边一定是递减的,只需逆序就可
/*
执行用时:12 ms, 在所有 C++ 提交中击败了6.71%的用户
内存消耗:11.6 MB, 在所有 C++ 提交中击败了89.06%的用户
*/
class Solution {
public:
void nextPermutation(vector<int>& nums) {
int N = nums.size();
int i = N - 2;
while(i >= 0 && nums[i] >= nums[i + 1])
{
--i;
}
if(i >= 0)
{
//此时的i指向的就是较小值
int j = N - 1;
while(nums[j] <= nums[i])
{
--j;
}
swap(nums[i], nums[j]);
//逆序i后面的数
reverse(nums.begin() + i + 1, nums.end());
}
else
{
reverse(nums.begin(), nums.end());
}
}
};
本文介绍了如何解决LeetCode上的一个算法问题,即找到一个数组的下一个更大排列。通过寻找数组中一个尽量靠右的较小值,并与右侧的一个最小的较大值交换,再对较小值右边的数进行逆序排列,可以得到新的排列。代码实现了这一过程,执行效率为12ms,内存使用率为11.6MB。
1515

被折叠的 条评论
为什么被折叠?



