☆打卡算法☆LeetCode 31、下一个排列 算法解析

本文涉及的产品
云解析DNS,个人版 1个月
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: “将数组序列重新排列成下一个更大的排列,如果不存在下一个更大的排列,则将数组排列成最小的排列。”

一、题目


1、算法题目

“将数组序列重新排列成下一个更大的排列,如果不存在下一个更大的排列,则将数组排列成最小的排列。”

题目链接:

来源:力扣(LeetCode)

链接:31. 下一个排列 - 力扣(LeetCode) (leetcode-cn.com)


2、题目描述

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

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

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

示例 1:
输入: nums = [1,2,3]
输出: [1,3,2]
复制代码
示例 2:
输入: nums = [3,2,1]
输出: [1,2,3]
复制代码
示例 3:
输入: nums = [1,1,5]
输出: [1,5,1]
复制代码
示例 4:
输入: nums = [1]
输出: [1]
复制代码


二、解题


1、思路分析

这个题注意到下一个排列总是比当前排列要打,除非该排列已经是最大的排列。

那么,我们可以从后向前查找第一个较小数,此时是下降序列。

找到了顺序对,那么就从后前查找第一个满足的元素,这个元素就是较大数。

交换较小数和较大数,就可以证明这个区间为降序,使用双指针反转区间使其变成升序,则无需对该区间进行排序。


2、代码实现

代码参考:

public class Solution {
    /// <summary>
    /// 翻转数组双指针逆序
    /// </summary>
    /// <param name="nums"></param>
    public void NextPermutation(int[] nums)
    {
        int n = nums.Length;
        //排除特殊情况
        if (n <= 1) return;
        //双指针
        int left = n - 2;
        int right = n - 1;
        //翻转最小字串
        while (right - left < n)
        {
            for (int i = right; i >left; i--)
            {
                //查询字符串是否可以翻转
                if (nums[i]> nums[left])
                {
                    //翻转left,i指针
                    int temp = nums[i];
                    nums[i] = nums[left];
                    nums[left] = temp;
                    //翻转left指针后所有项
                    for (int j = left+1; j <= left+(right-left+1)/2; j++)
                    {
                        temp = nums[j];
                        nums[j] = nums[right-j+left+1];
                        nums[right - j + left+1] = temp;
                    }
                    return;
                }
            }
            left--;
        }
        //数组顺序翻转数组
        for (int i = 0; i < n/2; i++)
        {
            int temp = nums[i];
            nums[i] = nums[n - 1 - i];
            nums[n - 1 - i] = temp;
        }
        return;
    }
}
复制代码

网络异常,图片无法展示
|


3、时间复杂度

时间复杂度 : O(N)

其中N为给定序列的长度,我么只需要扫描两次序列,进行一次反转操作。

空间复杂度: O(1)

只需要常数级的空间存放若干变量。


三、总结

这题感觉考的就是数学思维,当思路想明白了,代码也就出来了。



相关文章
|
18天前
|
算法
测试工程师的技能升级:LeetCode算法挑战与职业成长
这篇文章通过作者亲身体验LeetCode算法题的过程,探讨了测试工程师学习算法的重要性,并强调了算法技能对于测试职业成长的必要性。
38 1
测试工程师的技能升级:LeetCode算法挑战与职业成长
|
6天前
|
机器学习/深度学习 数据采集 存储
一文读懂蒙特卡洛算法:从概率模拟到机器学习模型优化的全方位解析
蒙特卡洛方法起源于1945年科学家斯坦尼斯劳·乌拉姆对纸牌游戏中概率问题的思考,与约翰·冯·诺依曼共同奠定了该方法的理论基础。该方法通过模拟大量随机场景来近似复杂问题的解,因命名灵感源自蒙特卡洛赌场。如今,蒙特卡洛方法广泛应用于机器学习领域,尤其在超参数调优、贝叶斯滤波等方面表现出色。通过随机采样超参数空间,蒙特卡洛方法能够高效地找到优质组合,适用于处理高维度、非线性问题。本文通过实例展示了蒙特卡洛方法在估算圆周率π和优化机器学习模型中的应用,并对比了其与网格搜索方法的性能。
71 1
|
14天前
|
算法 JavaScript 前端开发
国标非对称加密:RSA算法、非对称特征、js还原、jsencrypt和rsa模块解析
国标非对称加密:RSA算法、非对称特征、js还原、jsencrypt和rsa模块解析
77 1
|
15天前
|
缓存 算法 前端开发
深入理解缓存淘汰策略:LRU和LFU算法的解析与应用
【8月更文挑战第25天】在计算机科学领域,高效管理资源对于提升系统性能至关重要。内存缓存作为一种加速数据读取的有效方法,其管理策略直接影响整体性能。本文重点介绍两种常用的缓存淘汰算法:LRU(最近最少使用)和LFU(最不经常使用)。LRU算法依据数据最近是否被访问来进行淘汰决策;而LFU算法则根据数据的访问频率做出判断。这两种算法各有特点,适用于不同的应用场景。通过深入分析这两种算法的原理、实现方式及适用场景,本文旨在帮助开发者更好地理解缓存管理机制,从而在实际应用中作出更合理的选择,有效提升系统性能和用户体验。
41 1
|
23天前
|
机器学习/深度学习 算法 TensorFlow
【深度学习】深度学习语音识别算法的详细解析
深度学习语音识别算法是一种基于人工神经网络的语音识别技术,其核心在于利用深度神经网络(Deep Neural Network,DNN)自动从语音信号中学习有意义的特征,并生成高效的语音识别模型。以下是对深度学习语音识别算法的详细解析
43 5
|
20天前
|
JavaScript 算法 前端开发
"揭秘Vue.js的高效渲染秘诀:深度解析Diff算法如何让前端开发快人一步"
【8月更文挑战第20天】Vue.js是一款备受欢迎的前端框架,以其声明式的响应式数据绑定和组件化开发著称。在Vue中,Diff算法是核心之一,它高效计算虚拟DOM更新时所需的最小实际DOM变更,确保界面快速准确更新。算法通过比较新旧虚拟DOM树的同层级节点,递归检查子节点,并利用`key`属性优化列表更新。虽然存在局限性,如难以处理跨层级节点移动,但Diff算法仍是Vue高效更新机制的关键,帮助开发者构建高性能Web应用。
35 1
|
21天前
|
机器学习/深度学习 自然语言处理 负载均衡
揭秘混合专家(MoE)模型的神秘面纱:算法、系统和应用三大视角全面解析,带你领略深度学习领域的前沿技术!
【8月更文挑战第19天】在深度学习领域,混合专家(Mixture of Experts, MoE)模型通过整合多个小型专家网络的输出以实现高性能。从算法视角,MoE利用门控网络分配输入至专家网络,并通过组合机制集成输出。系统视角下,MoE需考虑并行化、通信开销及负载均衡等优化策略。在应用层面,MoE已成功应用于Google的BERT模型、Facebook的推荐系统及Microsoft的语音识别系统等多个场景。这是一种强有力的工具,能够解决复杂问题并提升效率。
35 2
|
28天前
|
算法 JavaScript 前端开发
对称加密算法解析:DES、AES及其在`pycryptodome` 和 `crypto-js` 模块中的应用
对称加密算法解析:DES、AES及其在`pycryptodome` 和 `crypto-js` 模块中的应用
79 1
|
1月前
|
存储 算法 Java
LeetCode经典算法题:打家劫舍java详解
LeetCode经典算法题:打家劫舍java详解
38 2
|
1月前
|
人工智能 算法 Java
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
34 1

推荐镜像

更多