【LeetCode】下一个排列【找规律】

实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。

如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。

必须原地修改,只允许使用额外常数空间。

以下是一些例子,输入位于左侧列,其相应输出位于右侧列。

1,2,3 → 1,3,2

3,2,1 → 1,2,3

1,1,5 → 1,5,1

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/next-permutation

分析:

方法1:直接调API,next_permutation函数

ps:不建议采用这种做法

方法2:寻找规律

1.先找到最大的索引k,满足v[k]<v[k+1],如果不存在,则说明当前序列是54321这种序列,其下一个序列是12345,直接翻转整个数组

2.再找到另外一个最大的索引L,满足v[L]>v[k]

3.交换v[L]和v[k]

4.翻转v[k+1,end]

总结起来就是一句话:从后往前遍历找到第一个降序值x,然后从后往前找到第一个比该值大的值y,交换着两个值,最后把该值后面的值逆转即可

时间复杂度:O(N)

空间复杂度:O(1)

class Solution {
public:
void nextPermutation(vector<int>& v)
{
    int n=v.size();
    if(n==1)
        return ;
    int flag=0;
    int k;
    for(int i=n-2; i>=0; i--)
    {
        if(v[i]<v[i+1])
        {
            flag=1;
            k=i;
            cout<<k<<endl;
            break;
        }
    }
    if(flag==0)
    {
        reverse(v.begin(),v.end());
        return ;
    }
    int l;
    int x=v[k];
    for(int i=n-1; i>=k; i--)
    {
        if(v[i]==x)
        {
            l=i;
            x=v[i];
        }else if(v[i]>x)
        {
            l=i;
            break;
        }
    }
    swap(v[k],v[l]);
    reverse(v.begin()+k+1,v.end());
}
};

原文地址:https://www.cnblogs.com/yinbiao/p/11348134.html

时间: 2024-11-05 20:32:45

【LeetCode】下一个排列【找规律】的相关文章

[leetcode] 31. 下一个排列

31. 下一个排列 发现规律后很简单: 下一个排列即是要找字典序中下一个更大的排列. 如串s:1 2 3 6 5 4 2 的下一个排列是 1 2 4 2 3 5 6 我们将数字串头点即为a,尾点记作b,从右往左看找到第一个降序数字的位置记为p,如例: 1236542 a_p___b 在s[p+1~b]子串中找到>s[p]的最小点,然后与s[p]交换: 1246532 a_p___b 此时,s[p+1~b]肯定仍然满足降序排列(从右往左看是升序),然后将s[p+1~b]做下reverse即可 12

LeetCode 31 Next Permutation(下一个排列)

翻译 实现"下一个排列"函数,将排列中的数字重新排列成字典序中的下一个更大的排列. 如果这样的重新排列是不可能的,它必须重新排列为可能的最低顺序(即升序排序). 重排必须在原地,不分配额外的内存. 以下是一些示例,左侧是输入,右侧是输出: 1,2,3 → 1,3,2 3,2,1 → 1,2,3 1,1,5 → 1,5,1 原文 Implement next permutation, which rearranges numbers into the lexicographically

Leetcode:Next Permutation 下一个排列

Next Permutation: Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers. If such arrangement is not possible, it must rearrange it as the lowest possible order (ie, sorted in ascending ord

[C++]LeetCode: 79 Next Permutation (下一个排列,常见面试题)

题目: Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers. If such arrangement is not possible, it must rearrange it as the lowest possible order (ie, sorted in ascending order). The repla

LeetCode:下一个排列【31】

LeetCode:下一个排列[31] 题目描述 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许使用额外常数空间. 以下是一些例子,输入位于左侧列,其相应输出位于右侧列.1,2,3 → 1,3,23,2,1 → 1,2,31,1,5 → 1,5,1 题目分析 什么样的排列将产生下一个更大的数字呢? 观察上面这个图,我们需要将数字 a[i-1]替换为位于其右侧区域的数

【LeetCode每天一题】Next Permutation(下一个排列)

Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers. If such arrangement is not possible, it must rearrange it as the lowest possible order (ie, sorted in ascending order). The replaceme

leetcode 31下一个排列

/** 验证一般情况(元素数目大于等于3)有几个情况分析:两个特殊情况: 6 5 4 3 2 1 完全反序,这种序列没有下一个排序,因此重新排序1 2 3 4 5 6 1 2 3 4 5 6 完全升序,很容易看出翻转5 6得到下一个排序: 因此对于以下一般情况有: 1 2 6 5 4 3 找到右边第一个a[i]<a[i+1]的元素2,再从右往左找出2的下一个元素3,交换2,3,之后对2右边元素reverse: 1 2 5 4 6 3 从右往左找到第一个a[i]<a[i+1]的元素4,从右往左找

【LeetCode】下一个排列与全排列问题

(一)下一个排列 题目(Medium):31. 下一个排列 题目描述: ??实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. ??如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). ??必须原地修改,只允许使用额外常数空间. ??以下是一些例子,输入位于左侧列,其相应输出位于右侧列. ??1,2,3 → 1,3,2 ??3,2,1 → 1,2,3 ??1,1,5 → 1,5,1 解题思路: ??本题有一个比较固定的算法思路,可以总结为以下

LeetCode 31. 下一个排列(Next Permutation)

题目描述 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许使用额外常数空间. 以下是一些例子,输入位于左侧列,其相应输出位于右侧列. 1,2,3 → 1,3,2 3,2,1 → 1,2,3 1,1,5 → 1,5,1 解题思路 由于各个排列按照字典序排序,所以以 1,3,2 → 2,1,3为例,寻找下一个排列的步骤是: 首先找到从后往前第一个升序数对,在此例中即(1