LeetCode第53题:最大子数组和【python 5种算法】

简介: LeetCode第53题:最大子数组和【python 5种算法】

作者介绍:10年大厂数据\经营分析经验,现任大厂数据部门负责人。

会一些的技术:数据分析、算法、SQL、大数据相关、python

欢迎加入社区:码上找工作

作者专栏每日更新:

LeetCode解锁1000题: 打怪升级之旅

python数据分析可视化:企业实战案例

题目描述

给定一个整数数组 nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

输入格式
  • nums:一个整数数组。
输出格式
  • 返回整数,表示最大子数组的和。

示例

示例 1
输入: nums = [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
示例 2
输入: nums = [1]
输出: 1

方法一:动态规划

解题步骤
  1. 定义状态dp[i] 表示以 nums[i] 结尾的最大子数组和。
  2. 状态转移dp[i] = max(nums[i], dp[i-1] + nums[i]),意味着当前元素单独成数组或加入前面的数组。
  3. 初始化dp[0] = nums[0],只有一个元素时最大和即为该元素。
  4. 遍历数组:根据状态转移方程更新 dp 数组。
  5. 得到结果:返回 dp 数组中的最大值,即为所求。
完整的规范代码
def maxSubArray(nums):
    """
    动态规划解法求最大子数组和
    :param nums: List[int], 输入的整数数组
    :return: int, 最大子数组的和
    """
    if not nums:
        return 0
    
    n = len(nums)
    dp = nums[0]
    max_sum = dp
    for i in range(1, n):
        dp = max(nums[i], dp + nums[i])
        if dp > max_sum:
            max_sum = dp
    return max_sum
# 示例调用
print(maxSubArray([-2,1,-3,4,-1,2,1,-5,4]))  # 输出: 6
算法分析
  • 时间复杂度:(O(n)),其中 n 是数组 nums 的长度,我们只需要遍历一次数组。
  • 空间复杂度:(O(1)),使用了常数空间存储 dp 状态和结果。

方法二:分治法

解题步骤
  1. 分治思想:将数组分成左右两部分,分别求左右部分的最大子数组和,以及跨越中点的最大子数组和。
  2. 递归求解:递归地对左右两部分数组应用分治法,直到数组长度为1。
  3. 合并结果:最大子数组和可能在左侧、右侧或跨越中心,取这三者的最大值。
完整的规范代码
def maxSubArray(nums):
    """
    分治法解决最大子数组和问题
    :param nums: List[int], 输入的整数数组
    :return: int, 最大子数组的和
    """
    def maxSubArrayDivideAndConquer(l, r):
        if l == r:
            return nums[l]
        mid = (l + r) // 2
        left_max = maxSubArrayDivideAndConquer(l, mid)
        right_max = maxSubArrayDivideAndConquer(mid + 1, r)
        
        max_left_border_sum = nums[mid]
        max_right_border_sum = nums[mid + 1]
        tmp = 0
        for i in range(mid, l - 1, -1):
            tmp += nums[i]
            if tmp > max_left_border_sum:
                max_left_border_sum = tmp
        
        tmp = 0
        for i in range(mid + 1, r + 1):
            tmp += nums[i]
            if tmp > max_right_border_sum:
                max_right_border_sum = tmp
        
        return max(left_max, right_max, max_left_border_sum + max_right_border_sum)
    
    return maxSubArrayDivideAndConquer(0, len(nums) - 1)
# 示例调用
print(maxSubArray([-2,1,-3,4,-1,2,1,-5,4]))  # 输出: 6
算法分析
  • 时间复杂度:(O(n \log n)),递归的每层需要 (O(n)) 的时间合并结果,共有 (\log n) 层。
  • 空间复杂度:(O(\log n)),递归栈的深度。

方法三:贪心算法

解题步骤
  1. 初始化变量:设置两个变量,current_sum 表示当前遍历到的子数组的和,max_sum 用来存储遍历过程中遇到的最大子数组和。
  2. 遍历数组:对数组中的每个元素进行遍历,根据贪心策略更新 current_summax_sum
  3. 更新当前和:如果 current_sum 小于0,就重新设置 current_sum 为当前元素,否则就累加当前元素。
  4. 更新最大和:每步都取 current_summax_sum 的较大值更新 max_sum
完整的规范代码
def maxSubArray(nums):
    """
    使用贪心算法计算最大子数组和
    :param nums: List[int], 输入的整数数组
    :return: int, 最大子数组的和
    """
    current_sum = max_sum = nums[0]
    for num in nums[1:]:
        current_sum = max(num, current_sum + num)
        max_sum = max(max_sum, current_sum)
    return max_sum
# 示例调用
print(maxSubArray([-2,1,-3,4,-1,2,1,-5,4]))  # 输出: 6
算法分析
  • 时间复杂度:(O(n)),其中 n 是数组 nums 的长度,因为我们只需遍历一次数组。
  • 空间复杂度:(O(1)),使用了常数额外空间。

方法四:改进的动态规划(空间优化)

解题步骤
  1. 初始化变量:与标准动态规划方法相似,但只用一个变量来存储上一个状态的 dp 值,从而减少空间使用。
  2. 遍历更新:遍历数组,根据 dp[i-1] 更新 dp[i]
  3. 记录最大和:在遍历过程中持续更新最大子数组和。
完整的规范代码
def maxSubArray(nums):
    """
    使用改进的动态规划算法(空间优化版本)求最大子数组和
    :param nums: List[int], 输入的整数数组
    :return: int, 最大子数组的和
    """
    n = len(nums)
    current = max_sum = nums[0]
    for i in range(1, n):
        current = max(nums[i], current + nums[i])
        max_sum = max(max_sum, current)
    return max_sum
# 示例调用
print(maxSubArray([-2,1,-3,4,-1,2,1,-5,4]))  # 输出: 6
算法分析
  • 时间复杂度:(O(n)),只需遍历数组一次。
  • 空间复杂度:(O(1)),不使用额外的空间除了几个必要变量。

方法五:分块累计法

解题步骤
  1. 分块累计:采用分块的方式累计子数组和,每当累计和小于0时重新开始计算。
  2. 遍历数组:在遍历过程中,对每个分块的和进行计算,并更新全局最大和。
完整的规范代码
def maxSubArray(nums):
    """
    使用分块累计法求最大子数组和
    :param nums: List[int], 输入的整数数组
    :return: int, 最大子数组的和
    """
    max_sum = nums[0]
    current_sum = 0
    for num in nums:
        current_sum += num
        if current_sum > max_sum:
            max_sum = current_sum
        if current_sum < 0:
            current_sum = 0
    return max_sum
# 示例调用
print(maxSubArray([-2,1,-3,4,-1,2,1,-5,4]))  # 输出: 6
算法分析
  • 时间复杂度:(O(n)),遍历一次数组。
  • 空间复杂度:(O(1)),仅使用固定空间。

不同算法的优劣势对比

特征 方法一: 动态规划 方法二: 贪心算法 方法三: 分治法 方法四: 改进动态规划 方法五: 分块累计法
时间复杂度 (O(n)) (O(n)) (O(n log n)) (O(n)) (O(n))
空间复杂度 (O(1)) (O(1)) (O(log n)) (O(1)) (O(1))
优势 - 基本且直观 - 实现简单 - 适合并行处理 - 空间高效 - 直观易懂
劣势 - 无显著劣势 - 需要理解逻辑 - 较慢 - 与方法一类似 - 与贪心相似

应用示例

金融分析

在金螌数据分析中,最大子数组和可以用来确定股票的最优买卖时期,即找出股价变动中的最大盈利窗口。

信号处理

在处理信号时,寻找最大子数组和可以用来检测一段时间内的最大信号强度,有助于从噪声中提取有用信号。


欢迎关注微信公众号 数据分析螺丝钉

目录
打赏
0
5
6
3
68
分享
相关文章
员工电脑监控场景下 Python 红黑树算法的深度解析
在当代企业管理范式中,员工电脑监控业已成为一种广泛采用的策略性手段,其核心目标在于维护企业信息安全、提升工作效能并确保合规性。借助对员工电脑操作的实时监测机制,企业能够敏锐洞察潜在风险,诸如数据泄露、恶意软件侵袭等威胁。而员工电脑监控系统的高效运作,高度依赖于底层的数据结构与算法架构。本文旨在深入探究红黑树(Red - Black Tree)这一数据结构在员工电脑监控领域的应用,并通过 Python 代码实例详尽阐释其实现机制。
26 6
基于 Python 迪杰斯特拉算法的局域网计算机监控技术探究
信息技术高速演进的当下,局域网计算机监控对于保障企业网络安全、优化资源配置以及提升整体运行效能具有关键意义。通过实时监测网络状态、追踪计算机活动,企业得以及时察觉潜在风险并采取相应举措。在这一复杂的监控体系背后,数据结构与算法发挥着不可或缺的作用。本文将聚焦于迪杰斯特拉(Dijkstra)算法,深入探究其在局域网计算机监控中的应用,并借助 Python 代码示例予以详细阐释。
33 6
如何在Python下实现摄像头|屏幕|AI视觉算法数据的RTMP直播推送
本文详细讲解了在Python环境下使用大牛直播SDK实现RTMP推流的过程。从技术背景到代码实现,涵盖Python生态优势、AI视觉算法应用、RTMP稳定性及跨平台支持等内容。通过丰富功能如音频编码、视频编码、实时预览等,结合实际代码示例,为开发者提供完整指南。同时探讨C接口转换Python时的注意事项,包括数据类型映射、内存管理、回调函数等关键点。最终总结Python在RTMP推流与AI视觉算法结合中的重要性与前景,为行业应用带来便利与革新。
|
17天前
|
基于 Python 哈希表算法的员工上网管理策略研究
于当下数字化办公环境而言,员工上网管理已成为企业运营管理的关键环节。企业有必要对员工的网络访问行为予以监控,以此确保信息安全并提升工作效率。在处理员工上网管理相关数据时,适宜的数据结构与算法起着举足轻重的作用。本文将深入探究哈希表这一数据结构在员工上网管理场景中的应用,并借助 Python 代码示例展开详尽阐述。
37 3
Python下的毫秒级延迟RTSP|RTMP播放器技术探究和AI视觉算法对接
本文深入解析了基于Python实现的RTSP/RTMP播放器,探讨其代码结构、实现原理及优化策略。播放器通过大牛直播SDK提供的接口,支持低延迟播放,适用于实时监控、视频会议和智能分析等场景。文章详细介绍了播放控制、硬件解码、录像与截图功能,并分析了回调机制和UI设计。此外,还讨论了性能优化方法(如硬件加速、异步处理)和功能扩展(如音量调节、多格式支持)。针对AI视觉算法对接,文章提供了YUV/RGB数据处理示例,便于开发者在Python环境下进行算法集成。最终,播放器凭借低延迟、高兼容性和灵活扩展性,为实时交互场景提供了高效解决方案。
探秘文件共享服务之哈希表助力 Python 算法实现
在数字化时代,文件共享服务不可或缺。哈希表(散列表)通过键值对存储数据,利用哈希函数将键映射到特定位置,极大提升文件上传、下载和搜索效率。例如,在大型文件共享平台中,文件名等信息作为键,物理地址作为值存入哈希表,用户检索时快速定位文件,减少遍历时间。此外,哈希表还用于文件一致性校验,确保传输文件未被篡改。以Python代码示例展示基于哈希表的文件索引实现,模拟文件共享服务的文件索引构建与检索功能。哈希表及其分布式变体如一致性哈希算法,保障文件均匀分布和负载均衡,持续优化文件共享服务性能。
公司电脑网络监控场景下 Python 广度优先搜索算法的深度剖析
在数字化办公时代,公司电脑网络监控至关重要。广度优先搜索(BFS)算法在构建网络拓扑、检测安全威胁和优化资源分配方面发挥重要作用。通过Python代码示例展示其应用流程,助力企业提升网络安全与效率。未来,更多创新算法将融入该领域,保障企业数字化发展。
53 10
基于 Python 广度优先搜索算法的监控局域网电脑研究
随着局域网规模扩大,企业对高效监控计算机的需求增加。广度优先搜索(BFS)算法凭借其层次化遍历特性,在Python中可用于实现局域网内的计算机设备信息收集、网络连接状态监测及安全漏洞扫描,确保网络安全与稳定运行。通过合理选择数据结构与算法,BFS显著提升了监控效能,助力企业实现智能化的网络管理。
35 7
关于员工上网监控系统中 PHP 关联数组算法的学术解析
在当代企业管理中,员工上网监控系统是维护信息安全和提升工作效率的关键工具。PHP 中的关联数组凭借其灵活的键值对存储方式,在记录员工网络活动、管理访问规则及分析上网行为等方面发挥重要作用。通过关联数组,系统能高效记录每位员工的上网历史,设定网站访问权限,并统计不同类型的网站访问频率,帮助企业洞察员工上网模式,发现潜在问题并采取相应管理措施,从而保障信息安全和提高工作效率。
37 7
从集思录可转债数据探秘:Python与C++实现的移动平均算法应用
本文探讨了如何利用移动平均算法分析集思录提供的可转债数据,帮助投资者把握价格趋势。通过Python和C++两种编程语言实现简单移动平均(SMA),展示了数据处理的具体方法。Python代码借助`pandas`库轻松计算5日SMA,而C++代码则通过高效的数据处理展示了SMA的计算过程。集思录平台提供了详尽且及时的可转债数据,助力投资者结合算法与社区讨论,做出更明智的投资决策。掌握这些工具和技术,有助于在复杂多变的金融市场中挖掘更多价值。
70 12

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等