求子数组的最大和

分治算法求子数组最大和 求最大子数组和也是一个非常经典的题目。此题目在leetcode,《编程之美》,《算法导论》,《编程珠玑》中都提到了,这是一个能显著体现出算法设计重要性的题目。通过不断地优化算法设计,该题目能够不断以更好更快的时间被解决。先看一下题目描述: 题目描述: 输入一个整形数组数组里有正数也有负数。 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 求所有子数组的和的最大值。要求时 阅读详情
程序员面试题精选(03)-求子数组的最大和
题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)
例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18
分析:本题最初为2005年浙江大学计算机系的考研题的最后一道程序设计题,在2006年里包括google在内的很多知名公司都把本题当作面试题。由于本题在网络中广为流传,本题也顺利成为2006年程序员面试题中经典中的经典。
如果不考虑时间复杂度,我们可以枚举出所有子数组并求出他们的和。不过非常遗憾的是,由于长度为n的数组有O(n2)个子数组;而且求一个长度为n的数组的和的时间复杂度为O(n)。因此这种思路的时间是O(n3)
很容易理解,当我们加上一个正数时,和会增加;当我们加上一个负数时,和会减少。如果当前得到的和是个负数,那么这个和在接下来的累加中应该抛弃并重新清零,不然的话这个负数将会减少接下来的和。基于这样的思路,我们可以写出如下代码。
参考代码:
/////////////////////////////////////////////////////////////////////////////
// Find the greatest sum of all sub-arrays
// Return value: if the input is valid, return true, otherwise return false
/////////////////////////////////////////////////////////////////////////////
bool FindGreatestSumOfSubArray
(
      int *pData,           // an array
      unsigned int nLength, // the length of array
      int &nGreatestSum     // the greatest sum of all sub-arrays
)
{
      // if the input is invalid, return false
      if((pData == NULL) || (nLength == 0))
            return false;
      int nCurSum = nGreatestSum = 0;
      for(unsigned int i = 0; i < nLength; ++i)
      {
            nCurSum += pData;
            // if the current sum is negative, discard it
            if(nCurSum < 0)
                  nCurSum = 0;

            // if a greater sum is found, update the greatest sum
            if(nCurSum > nGreatestSum)
                  nGreatestSum = nCurSum;
      }
      // if all data are negative, find the greatest element in the array
      if(nGreatestSum == 0)
      {
            nGreatestSum = pData[0];
            for(unsigned int i = 1; i < nLength; ++i)
            {
                  if(pData[i] > nGreatestSum)
                        nGreatestSum = pData[i];
            }
      }

      return true;
}


讨论:上述代码中有两点值得和大家讨论一下:
·         函数的返回值不是子数组和的最大值,而是一个判断输入是否有效的标志。如果函数返回值的是子数组和的最大值,那么当输入一个空指针是应该返回什么呢?返回0?那这个函数的用户怎么区分输入无效和子数组和的最大值刚好是0这两中情况呢?基于这个考虑,本人认为把子数组和的最大值以引用的方式放到参数列表中,同时让函数返回一个函数是否正常执行的标志。
·         输入有一类特殊情况需要特殊处理。当输入数组中所有整数都是负数时,子数组和的最大值就是数组中的最大元素。


面试题42. 连续子数组最大和-------输入一个整型数组数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。 一、题目描述 输入一个整型数组数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。 要求时间复杂度为O(n)。 二、示例 输入: nums = [-2,1,-3,4,-1,2,1,-5,4] 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。 三、解题思路 设置两个变量来保存当前值和最大值,用currentnum的正负来控制子序列,... 阅读详情

相关推荐

最大连续子数组

题目描述:给定一个数组数组里可能有正数,负数,0,数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个一个和。求所有子数组和的最大值。例如,如果输入数组为,和的最大子数组为{1,-2,3,10,-4,7,2,-5},那么输出为该子数组的和18 解法一:蛮力枚举法(时间复杂度:O(N*N*N))用三个for循环三层遍历,求出数组中每一个子数组的和,最终求出这些子数组和中最大的一个值。

xy的博客 567

YOLOv13涨点改进 | 全网独家创新、高效涨点改进篇 | CVPR 2024 | YOLOv13引入SHSA单头自注意力模块,减少冗余的多头注意力,轻量化改进,助力目标检测和图像分类任务高效涨点

本文提出了一种改进YOLOv13模型的新方法——SHSA(单头自注意力)模块,用于提升目标检测任务的计算效率和推理速度。SHSA通过简化多头注意力机制为单头结构,显著减少了计算冗余和内存占用。实验表明,该模块在保持精度的同时,在GPU、CPU和移动设备上分别实现了3.3倍、8.1倍和2.4倍的加速效果。文章详细介绍了SHSA的结构原理、核心代码实现方法,以及如何集成到YOLOv13的配置文件中。这种改进特别适合资源受限设备,为实时目标检测提供了更优的速度-精度平衡方案。

Ai缝合怪、助力小伙伴高效发论文 467

java 最大子数组_Java实现最大连续子数组

1 问题描述给定一个整数数组数组里可能有正数、负数和零。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。例如,如果输入的数组为{1,-2,3,10,-4,7,2,-5},和最大的子数组为{3,10,-4,7,2},那么输出为该子数组的和18。2 解决方案2.1 蛮力枚举法package com.liuzhen.array_2;public class M...

weixin_42514877的博客 546

【编程之法】最大连续子数组

题目描述 给定一个整数数组数组里可能有正数、负数和零。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值,并输出此子数组。例如,如果输入的数组为{1,-2,3,10,-4,7,2,-5},和最大的子数组为{3,10,-4,7,2},那么输出为该子数组的和18,和该子数组3 10 -4 7 2。 动态规划(编程之美P40,动态规划算法改编) cur

stormpang的博客 514

Algorithms(一)---最大子数组和问题

1.You are given an array containing both positive and negative integers and required to find the sub-array with the largest sum (O(N) a la KBL). Write a routine for the above.题目描述: 输入一个整形数组数组里有正数也有负数

陈先森~ 942

求最大连续子数列和(只扫描一次数列)

一、什么是求最大连续子数列和 首先来看看这是个怎样的问题的,问题描述:一个整型数组数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和,求所有子数组的和的最大值。注意:当全是负数的情况时,返回最大的那个负数 二、解题思路 这个问题的思路其实非常简单,从左到右扫描数组,在扫描过程中,记录数组的负数的个数和扫描过中数据中的最大值,并累加每个扫描到的数据的和,...

810364804 634

算法 - 求子数组最大和(C++)

分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击http://www.captainbed.net /* * 求子数组最大和 - C++ - by Chimomo * * 题目:输入一个整形数组数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 * 求所有子数组的和的最大值。要求时间复杂度为O(n...

了解➔熟悉➔掌握➔精通 4万+

环状连续数组求子数组最大和

今天看到环状连续数组求子数组最大和的题目,看了几篇博客,但是好像有问题,可以举出反例。于是参考其他人的博客自己又总结下。 首先,求非环状的数组中子数组 最大和问题是一个动态规划的思想。 sum[i] = max(sum(i-1) + a[i], a[i]); sum[i]代表以i元素结尾的子数组最大和,sum[i-1]代表以i-1元素结尾的子数组最大和,a[i]代表第i个元素的值,由此公式

1335

求子数组最大和

求子数组最大和 题目描述: 输入一个整形数组数组里有正数也有负数。 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 求所有子数组的和的最大值。要求时间复杂度为O(n)。 例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2, 因此输出为该子数组的和18 该题简单,但我还是没做出,

Roger_Jin的专栏 526

求子数组最大和(转)

第一节、求子数组最大和3.求子数组最大和题目描述:输入一个整形数组数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。 例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18。 分析:这个问题在各大公司面...

diansong7584的博客 155

程序员面试题精选(3):求子数组最大和

题目:输入一个整形数组数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18。分析:本题最初为2005年浙江大学计算机系的考研题的最后一道程序设计题,在2006年

yysdsyl的专栏 3802

剑指offer第二版面试题42:连续子数组最大和(java)

题目描述: 输入一个整型数组数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。例如输入的数组为{1,-2,3,10,-4,7,2,-5},和最大的子数组为{3,10,-4,7,2},因此输出为该子数组的和18。 分析思路:   Step1.从头到尾逐个累加数组中的每个数字,初始化和为0;(nCurrSum=0,nGre...

许文杰的博客 1280

《剑指offer31》:连续子数组最大和

这是《剑指offer》系列的第一篇,这个系列的文章主要用于记录看书时的一些感想,做个记录。 题目 输入一个整型数组数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。例: 思路 这里采用动态规划的思想: 第一步:做一个选择,基于这个选择产生一个或多个待解的子问题 这里用函数表示以第个数字结尾的子数组的最大...

qq_41603411的博客 320

关于返回一个整数数组中最大子数组的和的问题

题目:返回一个整数数组中最大子数组的和 要求:1、输入一个整形数组数组里有正数也有负数。    2数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。    3、求所有子数组的和的最大值。要求时间复杂度为O(n) 方法一:刚拿到这个题目时,先没有考虑时间复杂度的问题,就是想把所有的子数组的和算出来,然后在比较,思路简单,但循环次数多 package about_ban...

weixin_30315723的博客 234

动态规划典型例题--连续子数组最大和

题目描述:给定一个数组arr,数组中的元素有整数也有负数,数组中的一个或者连续多个数组成一个子数组。 求所有子数组里面的最大和。例如现在有数组 {1 , -2 , 3 , 10 , -4 , 7 , 2 , -5 }。 思路: 1.用暴力的方法,找出所有可能的子数组,然后找和最大的那个。这是可行的,但是时间复杂度为 n*n,显然是不够理想的。 2.动态规划思想。状态方程 : max

不要总是等明天再开始 1万+

基于MATLABSimulink与Simscape多体动力学仿真模块构建的_六轴任意姿态运动模拟系统_用于工业机器人运动学与动力学分析轨迹规划验证及控制算法测试_融合多体动力学.zip

基于MATLABSimulink与Simscape多体动力学仿真模块构建的_六轴任意姿态运动模拟系统_用于工业机器人运动学与动力学分析轨迹规划验证及控制算法测试_融合多体动力学.zip

上一篇: printf的格式控制的完整格式总结
下一篇: expr命令用法-实例讲解
adcxf
博客等级 码龄20年 163粉丝 111原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值