31. 下一个排列

本文介绍了如何解决LeetCode上的一个算法问题,即找到一个数组的下一个更大排列。通过寻找数组中一个尽量靠右的较小值,并与右侧的一个最小的较大值交换,再对较小值右边的数进行逆序排列,可以得到新的排列。代码实现了这一过程,执行效率为12ms,内存使用率为11.6MB。

题目链接: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());
		} 
    }
};
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值