0

0

使用单调栈优化Python代码的时间复杂度:O(n) 解决方案

花韻仙語

花韻仙語

发布时间:2025-09-16 19:14:04

|

621人浏览过

|

来源于php中文网

原创

 使用单调栈优化Python代码的时间复杂度:O(n) 解决方案

第一段引用上面的摘要: 本文旨在介绍如何使用单调栈这一数据结构,将原本时间复杂度为O(n²)的Python代码优化至O(n)。通过详细的代码示例和逐步解释,我们将展示如何利用单调栈高效地找到数组中每个元素右侧第一个更大的元素,并将其应用于特定的编码问题,最终实现时间复杂度的显著降低。 **问题背景与优化目标** 原始代码的目标是对一个数字数组进行编码,编码规则是:对于数组中的每个数字,找到它右侧第一个比它大的数字,并将这两个数字相加作为编码后的值。如果右侧没有更大的数字,则保持原值不变。原始代码使用嵌套循环实现,导致时间复杂度为O(n²),效率较低。我们的目标是找到一种更高效的算法,将时间复杂度降低到O(n)。 **单调栈简介** 单调栈是一种特殊的栈结构,其内部元素保持单调递增或单调递减的顺序。单调栈在解决某些特定问题时非常有效,例如: * 寻找数组中每个元素左/右侧第一个大于/小于它的元素。 * 计算直方图中最大的矩形面积。 在本例中,我们将使用单调递减栈来优化编码过程。 **O(n) 解决方案:单调栈的应用** 核心思想是维护一个单调递减栈,栈中存储的是数组元素的索引,而不是元素本身。这样做的好处是可以方便地访问数组元素,并在找到更大的元素时进行更新。 以下是使用单调栈优化的Python代码: ```python def encode_array(a): """ 使用单调栈对数组进行编码,时间复杂度为 O(n)。 Args: a: 待编码的数字数组。 Returns: 编码后的数组。 """ encoded = a[:] # 创建数组的副本,避免修改原始数组 s = [] # 初始化单调栈 for i, x in enumerate(a): # 栈不为空,并且当前元素大于栈顶元素所对应的数组元素 while s and x > a[s[-1]]: # 弹出栈顶元素,并将其编码为当前元素与栈顶元素所对应的数组元素之和 encoded[s.pop()] += x # 将当前元素的索引压入栈中 s.append(i) return encoded # 示例 a = [4, 3, 7, 3, 2, 8, 6, 1, 10, 3] encoded_array = encode_array(a) print(encoded_array) # 输出:[11, 10, 15, 11, 10, 18, 16, 11, 10, 3]

代码解释:

  1. encode_array(a) 函数: 接收一个数字数组 a 作为输入。
  2. encoded = a[:]: 创建数组 a 的副本,存储编码后的结果。这样做可以避免修改原始数组。
  3. s = []: 初始化一个空栈 s,用于存储数组元素的索引。
  4. for i, x in enumerate(a):: 遍历数组 a,i 是索引,x 是元素值。
  5. while s and x > a[s[-1]]:: 这是一个关键的循环。它检查栈是否为空,以及当前元素 x 是否大于栈顶元素所对应的数组元素 a[s[-1]]。如果满足这两个条件,说明找到了一个比栈顶元素更大的元素。
  6. encoded[s.pop()] += x: 弹出栈顶元素 s[-1],并将其对应的编码值更新为当前元素 x 与原编码值之和。
  7. s.append(i): 将当前元素的索引 i 压入栈中,保持栈的单调递减性。
  8. return encoded: 返回编码后的数组。

算法流程

算法从左到右扫描数组。对于每个元素,它会执行以下操作:

  1. 如果栈为空,或者当前元素小于等于栈顶元素所对应的数组元素,则将当前元素的索引压入栈中。
  2. 如果当前元素大于栈顶元素所对应的数组元素,则不断弹出栈顶元素,直到栈为空,或者当前元素小于等于栈顶元素所对应的数组元素。在弹出每个栈顶元素时,将其对应的编码值更新为当前元素与原编码值之和。最后,将当前元素的索引压入栈中。

时间复杂度分析

虽然代码中包含一个 while 循环,但每个元素最多只会被压入栈一次,也最多只会被弹出栈一次。因此,内层 while 循环的总执行次数不会超过 n。所以,整个算法的时间复杂度为 O(n)。

QIMI奇觅
QIMI奇觅

美图推出的游戏行业广告AI制作与投放一体化平台

下载

立即学习Python免费学习笔记(深入)”;

注意事项与总结

  • 单调栈是一种强大的数据结构,可以用于解决许多与查找特定元素相关的问题。
  • 在使用单调栈时,需要仔细考虑栈中存储的是元素本身还是元素的索引。
  • 理解单调栈的单调性是关键,它决定了栈中元素的排列顺序,以及如何利用栈来找到所需的元素。
  • 本例展示了如何使用单调栈将时间复杂度从 O(n²) 降低到 O(n),显著提高了代码的效率。

通过本教程,您应该已经掌握了使用单调栈优化Python代码的方法。希望这些知识能够帮助您在实际开发中编写出更高效、更优雅的代码。

					

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end=' ', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

186

2023.09.27

while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

95

2023.09.25

treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

538

2023.12.01

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

17

2025.12.22

深入理解算法:高效算法与数据结构专题
深入理解算法:高效算法与数据结构专题

本专题专注于算法与数据结构的核心概念,适合想深入理解并提升编程能力的开发者。专题内容包括常见数据结构的实现与应用,如数组、链表、栈、队列、哈希表、树、图等;以及高效的排序算法、搜索算法、动态规划等经典算法。通过详细的讲解与复杂度分析,帮助开发者不仅能熟练运用这些基础知识,还能在实际编程中优化性能,提高代码的执行效率。本专题适合准备面试的开发者,也适合希望提高算法思维的编程爱好者。

27

2026.01.06

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

397

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

575

2023.08.10

append用法
append用法

append是一个常用的命令行工具,用于将一个文件的内容追加到另一个文件的末尾。想了解更多append用法相关内容,可以阅读本专题下面的文章。

344

2023.10.25

clawdbot ai使用教程 保姆级clawdbot部署安装手册
clawdbot ai使用教程 保姆级clawdbot部署安装手册

Clawdbot是一个“有灵魂”的AI助手,可以帮用户清空收件箱、发送电子邮件、管理日历、办理航班值机等等,并且可以接入用户常用的任何聊天APP,所有的操作均可通过WhatsApp、Telegram等平台完成,用户只需通过对话,就能操控设备自动执行各类任务。

11

2026.01.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.3万人学习

Django 教程
Django 教程

共28课时 | 3.6万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号