Python算法题集_最大子数组和

news2024/11/15 14:05:12

本文为Python算法题集之一的代码示例

题目53:最大子数组和

说明:给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

子数组 是数组中的一个连续部分。

示例 1:

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

示例 2:

输入:nums = [1]
输出:1

示例 3:

输入:nums = [5,4,-1,7,8]
输出:23

提示:

  • 1 <= nums.length <= 105

  • -104 <= nums[i] <= 104


- 问题分析

  1. 本题为求数组中的子数组的最大和
  2. 主要的计算为2个,1子数组遍历,2子数组求和
  3. 基本的遍历为双层循环,双层循环遍历子数组,每个子数组求和一次,所以基本的时间算法复杂度为(On2)

- 优化思路

  1. 减少循环层次

  2. 减少计算类别

  3. 通过动态规划分析最优路径

    1. 前缀和之差(第1到第n的累加为前缀和,前缀和之间的差为两个元素之间子数组的和)
    2. 递归思路,第n个元素为止的最大和,为之前的最大和max_n与包含元素n的子数组最大和【max(premax+元素n、元素n)】中最大者

  • CheckFuncPerf是我写的函数用时和内存占用模块,地址在这里:Python算法题集_检测函数用时和内存占用的模块【自搓】
  • 测试的超时测试用例文件是官网的,已上传到CSDN,地址在这里:力扣算法题:最大子数组和测试用例,用于测试超时,数组长度21808(估计是2月1日过审)

  1. 标准求解,双层循环,超时失败在这里插入图片描述

    import CheckFuncPerf as cfp
    
    def maxSubArray_base(nums):
        if len(nums) == 1:
            return nums[0]
        imaxsum, ileftsum = nums[0], nums[0]
        for iIdx in range(len(nums)-1):
            ileftsum += nums[iIdx]
            irightsum = 0
            for jIdx in range(iIdx+1, len(nums)):
                irightsum += nums[jIdx]
                if ileftsum > 0:
                    if ileftsum+irightsum > imaxsum:
                        imaxsum = ileftsum+irightsum
                else:
                    if irightsum > imaxsum:
                        imaxsum = irightsum
        return imaxsum
    
    testcase_big = open(r'testcase/hot13_big.txt', mode='r', encoding='utf-8').read().replace('[', '').replace(']', '')
    testcase_big = testcase_big.split(',')
    nums = [int(x) for x in testcase_big]
    result = cfp.getTimeMemoryStr(maxSubArray_base, nums)
    print(result['msg'], '执行结果 = {}'.format(result['result']))
    
    # 运行结果
    函数 maxSubArray_base 的运行时间为 19834.08 ms;内存使用量为 4.00 KB 执行结果 = 1364833
    
  2. 优化版一【采用前缀和】,虽有想法,超时依旧在这里插入图片描述

    import CheckFuncPerf as cfp
    
    def maxSubArray_ext1(nums):
        if len(nums) == 1:
            return nums[0]
        presum = [0] * len(nums)
        isum, imaxsum = 0, nums[0]
        for iIdx in range(len(nums)):
            isum += nums[iIdx]
            presum[iIdx] = isum
        for iIdx in range(len(nums)-1):
            for jIdx in range(iIdx+1, len(nums)):
                imaxsum = max(imaxsum, presum[iIdx], presum[jIdx], presum[jIdx]-presum[iIdx])
        return imaxsum
    
    testcase_big = open(r'testcase/hot13_big.txt', mode='r', encoding='utf-8').read().replace('[', '').replace(']', '')
    testcase_big = testcase_big.split(',')
    nums = [int(x) for x in testcase_big]
    result = cfp.getTimeMemoryStr(maxSubArray_ext1, nums)
    print(result['msg'], '执行结果 = {}'.format(result['result']))
    
    # 运行结果
    函数 maxSubArray_ext1 的运行时间为 15518.62 ms;内存使用量为 144.00 KB 执行结果 = 1364833
    
  3. 优化版二【滑动窗口,单层循环】,勉强通过,超过27%在这里插入图片描述

    import CheckFuncPerf as cfp
    
    def maxSubArray_ext2(nums):
        if len(nums) == 1:
            return nums[0]
        presum = [0] * len(nums)
        isum, imaxsum, iminsum = 0, nums[0], nums[0]
        for iIdx in range(len(nums)):
            isum += nums[iIdx]
            presum[iIdx] = isum
            if iIdx > 0:
                imaxsum = max(imaxsum, isum, isum - iminsum)
            iminsum = min(isum, iminsum)
        return imaxsum
    
    testcase_big = open(r'testcase/hot13_big.txt', mode='r', encoding='utf-8').read().replace('[', '').replace(']', '')
    testcase_big = testcase_big.split(',')
    nums = [int(x) for x in testcase_big]
    result = cfp.getTimeMemoryStr(maxSubArray_ext2, nums)
    print(result['msg'], '执行结果 = {}'.format(result['result']))
    
    # 运行结果
    函数 maxSubArray_ext2 的运行时间为 6.99 ms;内存使用量为 296.00 KB 执行结果 = 1364833
    
  4. 优化版三【动态规划,递归思路求解】,马马虎虎,超过60%在这里插入图片描述

    import CheckFuncPerf as cfp
    
    def maxSubArray_ext3(nums):
        imaxpre, imaxsum = 0, nums[0]
        for iIdx in range(len(nums)):
            imaxpre = max(nums[iIdx], nums[iIdx] + imaxpre)
            imaxsum = max(imaxsum, imaxpre)
        return imaxsum
    
    testcase_big = open(r'testcase/hot13_big.txt', mode='r', encoding='utf-8').read().replace('[', '').replace(']', '')
    testcase_big = testcase_big.split(',')
    nums = [int(x) for x in testcase_big]
    result = cfp.getTimeMemoryStr(maxSubArray_ext3, nums)
    print(result['msg'], '执行结果 = {}'.format(result['result']))
    
    # 运行结果
    函数 maxSubArray_ext3 的运行时间为 5.99 ms;内存使用量为 4.00 KB 执行结果 = 1364833
    
  5. 优化版四【分支改良】,有所改善,超越83%在这里插入图片描述

    在优化版四的基础上,进行流程分支改良,去掉了一批加法计算

    import CheckFuncPerf as cfp
    
    def maxSubArray_ext4(nums):
        imaxpre, imaxsum = 0, nums[0]
        for iIdx in range(len(nums)):
            if imaxpre > 0:
                imaxpre = nums[iIdx] + imaxpre
            else:
                imaxpre = nums[iIdx]
            imaxsum = max(imaxsum, imaxpre)
        return imaxsum
    
    testcase_big = open(r'testcase/hot13_big.txt', mode='r', encoding='utf-8').read().replace('[', '').replace(']', '')
    testcase_big = testcase_big.split(',')
    nums = [int(x) for x in testcase_big]
    result = cfp.getTimeMemoryStr(maxSubArray_ext4, nums)
    print(result['msg'], '执行结果 = {}'.format(result['result']))
    
    # 运行结果
    函数 maxSubArray_ext4 的运行时间为 4.02 ms;内存使用量为 0.00 KB 执行结果 = 1364833
    

    一日练,一日功,一日不练十日空

    may the odds be ever in your favor ~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1424632.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RS485自动收发电路震荡的问题

电路 设计初衷 电源5V 选择5V的原因&#xff0c;差分2.5V比1.5V可以提高传输能力 TTL输入 3.3V电平满足需求 TTL输出 4.5V了&#xff0c;MCU是3.3V平台 这样就分为两种情况 MCU接收端可以容忍5V输入 MCU接收端不可以容忍5V输入&#xff0c;就要进行电压转换&#xff0c;我这里使…

【C++】STL优先级队列(priority_queue)

priority_queue 基本介绍 priority_queue就是优先级队列。其头文件就是queue&#xff0c;但是队列和优先级队列关系不大&#xff0c;两个是不同的数据结构。但二者都是适配器&#xff0c;容器适配器。 优先级队列中存放的数据是有优先级的。 其内部有以下成员方法&#xff0c…

跟着cherno手搓游戏引擎【17】整理代码、timestep和transform

这里就不分部走了&#xff0c;直接上代码。 全局&#xff1a; YOTO.h:添加renderer的头文件&#xff1a; #pragma once//用于YOTO APP#include "YOTO/Application.h" #include"YOTO/Layer.h" #include "YOTO/Log.h"#include"YOTO/Core/T…

V2X,启动高增长引擎

车载通讯的下一个新周期&#xff0c;毋庸置疑是V2X。从4G、5G再到C-V2X&#xff0c;是车载通讯逐步从信息娱乐、行车数据监控到万物互联的关键。 去年5月&#xff0c;全球车载通讯芯片巨头—高通公司宣布&#xff0c;与以色列车联网&#xff08;V2X&#xff09;芯片设计公司Aut…

DevOps落地笔记-05|非功能需求:如何有效关注非功能需求

上一讲主要介绍了看板方法以及如何使用看板方法来解决软件研发过程中出现的团队过载、工作不均、任务延期等问题。通过学习前面几个课时介绍的知识&#xff0c;你的团队开始源源不断地交付用户价值。用户对交付的功能非常满意&#xff0c;但等到系统上线后经常出现服务不可用的…

扣库的函数经验

有的库确实可以提出来的 比如这个库 GitHub - intel/x86-simd-sort: C template library for high performance SIMD based sorting algorithms 根据自己的需要是可以&#xff0c;把内容抠出来的&#xff0c;重新build的。 我就自己新建了一个vs的工程&#xff0c;然后把源…

将java对象转换为json字符串的几种常用方法

目录 1.关于json 2.实现方式 1.Gson 2.jackson 3.fastjson 3.与前端的联系 1.关于json JSON是一种轻量级的数据交换格式。它由Douglas Crockford在2001年创造。JSON的全称是JavaScript Object Notation&#xff0c;它是一种文本格式&#xff0c;可以轻松地在各种平台之间传…

【GEE】基于GEE可视化和下载Landsat8 L2A数据(镶嵌、裁剪)

之前发过一篇使用GEE下载Landsat8的文章&#xff0c;然后有很多小伙伴私信我各种问题&#xff0c;如L1C、L2数据代码怎么修改&#xff0c;如何镶嵌&#xff0c;如何去云、 如何裁剪等一系列问题。正好快过年了&#xff0c;手头的事也没有多少了&#xff0c;所以这两天整理了一下…

考研高数(数列极限之f(xn)和{xn}的关系)

说白了&#xff0c;f(xn)是复合函数&#xff0c;是f(x)与{xn}的复合函数。&#xff08;复合函数的单调性有同增异减的原则&#xff09; 例题1&#xff1a;【可以用同增异减的原则&#xff0c;迅速解答&#xff08;有不合理的地方&#xff0c;请各位大佬指正&#xff01;&#…

【操作系统】FileOutputStream的flush操作有时不生效

按照我们的理解&#xff1a;FileOutputStream的flush()方法的作用就是将缓冲区中的数据立即写入到文件中&#xff0c;即使缓冲区没有填满。这样可以确保数据的及时写入&#xff0c;而不需要等待缓冲区填满或者调用 close() 方法关闭流时才写入。真的是这样吗&#xff1f;&#…

dv和ov通配符SSL证书的区别

SSL数字证书是一种数字证书&#xff0c;可以保护网站传输数据安全以及对服务器身份进行验证&#xff0c;SSL证书有很多种&#xff0c;而通配符证书则是其中的一种特殊类型。SSL证书旗下的通配符SSL证书随着互联网的发展&#xff0c;颁发量也越来越多&#xff0c;为了使用户选择…

websocket编写聊天室

【黑马程序员】WebSocket打造在线聊天室【配套资料源码】 总时长 02:45:00 共6P 此文章包含第1p-第p6的内容 简介 温馨提示&#xff1a;现在都是第三方支持聊天&#xff0c;如极光&#xff0c;学这个用于自己项目完全没问题&#xff0c;大项目不建议使用 需求分析 代码

Celeryconfig配置文件

Celery配置文件 本篇介绍Celery配置文件相关&#xff0c;celeryconfig.py Celeryconfig.py 在上篇celery基础用法中&#xff0c;是这样使用celery的实例化的。 # tasks.py 文件名需与实例化对象第一个参数一致 import time from celery import Celeryredis_url redis://Pa…

重磅!讯飞星火V3.5正式发布,3大核心能力超GPT-4 Turbo!

1月30日&#xff0c;科大讯飞召开星火认知大模型V3.5升级发布会&#xff0c;这是国内首个基于全国产算力训练的多模态认知大模型。科大讯飞董事长刘庆峰先生、研究院院长刘聪先生出席了大会&#xff0c;并对最新产品进行了多维度解读。 讯飞星火V3.5的7大核心能力实现全面大幅…

用的到的linux-文件移动-Day2

前言&#xff1a; 在上一节&#xff0c;我们复习了cd大法和创建生成文件和文件夹的方法&#xff0c;介绍了一些“偷懒”&#xff08;高效&#xff09;的小技巧&#xff0c;本节&#xff0c;我们一起来探讨下&#xff0c;我们对文件移动操作时有哪些可以偷懒的小技巧~ 一、复制…

Oracle 集群】RAC知识图文详细教程(四)--缓存融合技术和主要后台进程

Cache Fusion 原理 前面已经介绍了 RAC 的后台进程&#xff0c;为了更深入的了解这些后台进程的工作原理&#xff0c;先了解一下 RAC 中多节点对共享数据文件访问的管理是如何进行的。要了解 RAC 工作原理的中心&#xff0c;需要知道 Cache Fusion 这个重要的概念&#xff0c;要…

基于腾讯云服务器搭建幻兽帕鲁服务器保姆级教程

随着网络游戏的普及&#xff0c;越来越多的玩家希望能够拥有自己的游戏服务器&#xff0c;以便能够自由地玩耍。而腾讯云服务器作为一个优秀的云计算平台&#xff0c;为玩家们提供了一个便捷、稳定、安全的游戏服务器解决方案。本文将为大家介绍如何基于腾讯云服务器搭建幻兽帕…

三、C++中的Mat对象

图片在C中是作为矩阵Matrix进行处理对待的&#xff0c;通过Mat数据类型进行处理 新建项目这里就不再赘述了哈&#xff0c;可以参考博文&#xff1a;零、环境搭建(第三部分Visula Studio中新建项目) 我这边创建的项目名称为&#xff1a;1_31_matrix 为了养成良好的项目开发习惯…

ubuntu QT openssl支持https

1、Building Qt 5 from Git - Qt Wiki 2、下载编译对应的opengssl [ 1.1.1 ] - /source/old/1.1.1/index.html 3、安装所需基础工具 sudo apt-get install build-essential perl python3 git sudo apt-get install ^libxcb.*-dev libx11-xcb-dev libglu1-mesa-dev libxrende…

基于YOLOv8的水下生物检测,多种优化方法---MSAM(CBAM升级版)助力涨点(二)

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文主要内容:详细介绍了水下生物检测整个过程&#xff0c;从数据集到训练模型到结果可视化分析&#xff0c;以及如何优化提升检测性能。 &#x1f4a1;&#x1f4a1;&#x1f4a1;加入自研注意力MSAM mAP0.5由原始的0.522提升至0.534…