数据结构学习 leetcode31 下一个排列

发布时间:2024年01月15日

关键词:下一个排列 字典序 排列

这是我在做jz38字符串的排序的时候,一种解题方法是字典序,用到的就是这种方法。这种方法支持不重复地输出全排列。

题目:下一个排列

思路:

我看了官方题解这位大哥的题解,建议直接看他们吧!

这个题需要记一记。两次扫描,找较小值和较大值。

复杂度计算:

时间复杂度O(n) 两次扫描

空间复杂度O(1)

代码:

class Solution {
public:
    void nextPermutation(vector<int>& nums) {
        int i=nums.size()-2;
        while(i>=0&&nums[i]>=nums[i+1])//找小数,从右到左第一个非降序排列的数
        {
            i--;
        }//此时可以知道,[i+1,end)的数都是降序排列的
        if(i>=0)//找到nums[i]<nums[i+1]
        {
            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());//区间 [i+1,n) 必为降序。我们可以直接使用双指针反转区间 [i+1,n) 使其变为升序,而无需对该区间进行排序。
    }
};

文章来源:https://blog.csdn.net/rainssssss/article/details/135607648
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。