剑指offer 学习笔记 连续子数组的最大和

2023-11-10

面试题42:连续子数组的最大和。输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求子数组中数字的和的最大值,要求时间复杂度为O(n)。

直观解法是枚举数组中所有子数组并求出它们的和。一个长度为n的数组,总共有n(n+1)/2个子数组,计算出所有子数组的和,最快也要O(n²)。

解法一:我们试着从头到尾逐个累加数组中的每个数字。和初始化为0。例如输入数组为{1,-2,3,10,-4,7,2,-5}。我们第一步加上第一个数字1,此时和为1。第二步加上数字-2,此时和为-1,。若第三步再加3,得到的和比3还小,即,从第一个数字开始的子数组的和会小于从第三个数字开始的子数组的和。因此,我们不用考虑从第一个数字开始的子数组,之前的累加的和也被抛弃。之后我们从数字3开始累加,此时和为3。第四步加10,得到的和为13,。第五步加-4,我们发现,和为9,且比原来的和13要小。因此我们需要把之前得到的和13保存下来,因为它有可能是最大的子数组的和。第六步加上数字7,得到和为16,此时相比之前保存的和13要大,那么就更新最大子数组的和为16。重复以上步骤即可:

#include <iostream>
using namespace std;

bool g_InvalidInput = false;

int FindGreatestSumOfSubArray(int* nums, int length) {
    if (nums == nullptr || length < 1) {
        g_InvalidInput = true;
        return 0;
    }
    g_InvalidInput = false;

    int maxSum = 0x80000000;    // 将最大和设置为最小的int值
    int currentSum = 0;

    for (int i = 0; i < length; ++i) {
        if (currentSum <= 0) {    
            currentSum = nums[i];
        } else {
            currentSum += nums[i];
        }

        if (currentSum > maxSum) {
            maxSum = currentSum;
        }
    }
    return maxSum;
}

int main() {
    int nums[] = { 1,-2,3,10,-4,7,2,-5 };
    int GreatestSumOfSubArray = FindGreatestSumOfSubArray(nums, sizeof(nums) / sizeof(*nums));
    if (!g_InvalidInput) {
        cout << FindGreatestSumOfSubArray(nums, sizeof(nums) / sizeof(*nums)) << endl;
    } else {
        cout << "输入错误。" << endl;
    }
}

解法二:动态规划解法。如果用f(i)表示以第i个数字结尾的子数组的最大和,那么我们需要求出max{f(i)},0<=i<n,我们可以用以下公式求f(i):
在这里插入图片描述
公式中的f(i)与上面代码中currentSum对应,而max{f(i)}与maxSum对应。代码与解法一相同。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

剑指offer 学习笔记 连续子数组的最大和 的相关文章

  • java深拷贝循环单链表,JZ25-复杂链表的复制

    题目描述 输入一个复杂链表 每个节点中有节点值 以及两个指针 一个指向下一个节点 另一个特殊指针random指向一个随机节点 请对此链表进行深拷贝 并返回拷贝后的头结点 注意 输出结果中请不要返回参数中的节点引用 否则判题程序会直接返回空
  • 由栈和队列完成数组的逆置操作(C语言)

    将数组a 11 1 3 6 10 15 16 17 18 19 20 通过栈和队列实现元素逆置的算法 入栈 gt 出栈 gt 入队 gt 出队 include stdio h include stdlib h typedef int dat
  • LangChain 中的嵌入

    在自然语言处理 NLP 领域 嵌入已经成为游戏规则的改变者 它们使我们能够将单词和文档转换为计算机可以理解的数字 这些数字表示 称为嵌入 对于理解文本 分析情感和翻译语言等任务至关重要 本文探讨了LangChain中的嵌入 这是一个用于创建
  • windows上bug崩溃定位分析(Qt或者VS)

    任何情况下 都不能保证自己写的代码不会发生崩溃 崩溃不可怕 可怕的是无法定位哪里崩溃 特别是客户那边崩溃 开发者这边不崩溃 问题陷入僵局 自从有了下面这个神奇的代码 再也不怕了 以下代码亲自测试没问题 1 如果是在VC 中 那么只需要将下列
  • 干货系列三:一台服务器能承载多少人同时访问?

    有很多人都会问这个问题 服务器能承载多少人同时访问 这个问题其实是很难有一个非常准确的答案的 因为服务器能同时承载的在线人数是受到多方面因素共同影响的结果 比如带宽 服务器处理速度以及访问页面的大小等等因素 虽然很难有一个精确的答案 但是服
  • 60秒轻松计算出任意一年任意一天星期几?

    60秒轻松计算出任意一年任意一天星期几 一 提出问题 60秒就可以轻松计算出任意一年任意一天星期几吗 你相信吗 如果能算出 连脑神经专家都认为是神童 大家可以通过度娘搜索 张戈 自闭症 连人民网都有报道 有图为证 如何快速计算出任意一年任意
  • Spring Security详解

    第一节 Spring Security 简介 Spring 是一个非常流行和成功的 Java 应用开发框架 Spring Security 基于 Spring 框架 提供了一套 Web 应用安全性的完整解决方案 一般来说 Web 应用的安全

随机推荐

  • maven高级学习

    maven高级 一 idea创建maven项目 1 1 idea中创建maven web项目 1 2 idea中使用tomcat 1 3 插件和依赖的区别 二 依赖管理 2 1 依赖配置 2 2 依赖传递 2 2 1 依赖传递中的冲突问题
  • Yii Framework 开发教程(14) UI 组件 MaskedTextField示例

    CMaskedTextField为格式输入框 可以为文本框指定Mask限制用户可以出入的文本格式 如本例使用99 99 9999 可以只允许输入类似日期的文本 修改View 添加CMaskedTextField 组件 php view pl
  • java比较mysql两个数据库_用java实现操作两个数据库的数据

    1 首先需要在jdbc的配置文件里面配置两个数据库的连接 数据库1的配置 driverClassName com mysql jdbc Driver url jdbc mysql 地址 3306 数据库名 useUnicode true c
  • 【SQL入门系列二】SQLZOO 分组

    分组 5 SUM and COUNT 5 SUM and COUNT Aggregate functions SUM COUNT MAX AVG SUM 世界总人口 SELECT SUM population FROM world Afri
  • springboot整合ehcache

    springboot整合ehcache springboot版本 2 5 1 1 pom文件
  • 12、计算机图形学——几何(网格细分与网格简化)

    一 网格细分 1 1 概念 网格细分指的是将原有模型上的网格分成更多个网格 从而将模型变得更加精细 提高渲染出来的效果 让画面更加漂亮 下图就是一个网格细分的示意 左图是细分前的效果 右图是细分后的效果 可见 细分后的面数更多 模型更加精细
  • java将网络图片下载并压缩导出到本地

    java将网络图片下载并压缩导出到本地 package com example demo ChartGraphics test import org apache tools zip ZipEntry import org apache t
  • 使用VsCode搭建Node.js服务器开发环境

    使用VsCode搭建Node js服务器开发环境 在进行Node js服务器开发时 一个好的集成开发环境可以帮助您更快地编写代码 并且提高程序的效率 在此推荐安装配置VSCode作为Node js服务器开发环境 下面介绍安装配置过程 Ste
  • ZYNQ ARM核之SCU

    Snoop Control Unit 窥探控制单元 详情见UG585 SCU主要是解决ARM的L1和L2的缓存协调 因为两个processor的缓存是共用的 和AXI总线的ACP存取的 也就是DMA等高速中断需求的外设 SCU 块将两个 C
  • javascript 基础知识之derfer 妙用

    javascript 一般是加载完后立即执行 但是有些时候并不想立即执行 而是等到页面装载完毕时再执行 怎么实现这样的需求呢 答案就是使用
  • DHCP技术原理详解

    今天给大家讲解一下DHCP的原理和技术细节 本文从DHCP基本原理 实现流程和DHCP重启后的流程和租约和续约机制三个方面对DHCP进行了全方位的讲解 基本上涵盖了DHCP的全方面 一 DHCP基本原理 DHCP Dynamic Host
  • JDBC编程——JDBC连接数据库六步骤

    JDBC编程的6步骤 实现数据库连接之前 我们要先理解一下URL 统一资源定位器 是跟数据库进行连接的时候 用来连接到指定远程数据库标识符 可以在该URL中指定连接用户名和密码 同时 对于不同的数据库有不同的标识 URL 统一资源定位符 U
  • sort排序的用法

    https www cnblogs com stones dream p 10183210 html
  • 【IT项目管理】第七章课后习题

    完成作业1 3的要求 使用 project 或其他项目管理工具 1 成本模型如下图 2 为项目每个月制定成本基线如下图 3 已知 Budget at Completion BAC 200000 Planned Value PV 120000
  • 深度学习 图像融合使用笔记 2023 harmonized

    目录 cvpr2023 INR Harmonization即将开源 CDTnet没开源 DCCF 图像滤镜 变色 pil灰度图转opencv
  • java Type 详解

    转自 https blog csdn net gdutxiaoxu article details 68926515 为什么要写这一系列的博客呢 因为在 Android 开发的过程中 泛型 反射 注解这些知识进场会用到 几乎所有的框架至少都
  • 简约精致的目录浏览程序:Files Photo Gallery

    引言 灵均说尽孤高事 全与逍遥意不同 勿埋我心 该程序给勿埋我心的感觉就是特别的简单 从头到尾就是一个php文件 但是它能够实现的功能却不容小觑 它用作在线相册是个不错的选择 简单介绍一下 Files是一个单文件的PHP应用程序 可以拖放到
  • 基于YOLOv7的头部解耦改进

    基于YOLOv7的头部解耦改进 利用YOLOX解耦头优化YOLOv7 提高计算机视觉识别率 近年来 计算机视觉技术不断发展 其中物体识别技术的提升对于多个领域具有重要意义 目前 一种被广泛使用的物体识别算法是 YOLO You Only L
  • 算法讲解--选择排序、数组链表

    算法讲解 选择排序 数组链表 数组和链表 选择排序 本文是对 算法图解 的第二章的学习的笔记 欢迎多多指正 数组和链表 数组 使用数组存储item意味着所有item在内存中都是相连的 在数组中存储新的item可能很麻烦 because if
  • 剑指offer 学习笔记 连续子数组的最大和

    面试题42 连续子数组的最大和 输入一个整型数组 数组里有正数也有负数 数组中的一个或连续多个整数组成一个子数组 求子数组中数字的和的最大值 要求时间复杂度为O n 直观解法是枚举数组中所有子数组并求出它们的和 一个长度为n的数组 总共有n