这是一个在面试中出现概率很高的一道题目,就拿我来说吧,面试了5家公司中,两家公司问了这道题目,可见,这道题目是非常经典的。

      解题思想也不是很难,我熟悉的有;两种解题办法:

      1. 一直连加,终止当前序列的条件是连加的和是负数

      因为,一个数加上一个负数之后肯定是没有原来的数值大,所以,这肯定是没有意义的,最终,我们利用这个思想得到如下的解法。

      函数声明:

ll DutMaxSeqSubArray_1(int*, int);
typedef long long ll;

      源代码:

/*非常常见的最大连续子数组的解法*/
bool _DutMaxSeqSubArray = false;
ll DutMaxSeqSubArray_1(int* A, int size)
{if (!A || size <= 0){_DutMaxSeqSubArray = true;return -1;}ll result = 1 << 31;ll currentSum = 0;/*循环走一遍数组,遇到加和为负数时就开始下一轮加和*/for (int i = 0; i < size; ++i){if (currentSum <= 0)currentSum = A[i];elsecurrentSum += A[i];if (result < currentSum)result = currentSum;}return result;
}

      2. 动态规划的思想:连续子数组最大和也一定是以某一个值结尾

      无论连续子数组有几个数,也不论和是多大,它总是以一个数结束的,而那个数肯定也是出现在数组中,所以,可以得到如下的递推公式: 

      以当前数结尾的最大连续子数组之和是:

      pData[i] = pData[i - 1] + A[i] || A[i]

      所以,可以得到如下的解法:

      函数声明:

ll DutMaxSeqSubArray_2(int*, int);

      源代码:

/*动态规划的解法*/
ll DutMaxSeqSubArray_2(int* A, int size)
{if (!A || size <= 0){_DutMaxSeqSubArray = true;return -1;}ll result = 1 << 31;ll currentSum = 0;for (int i = 0; i < size; ++i){/**思想是,最大连续子数组肯定是以某一个数组元素结尾的,所以,*按照那个数字结尾时的最大加和就可以求得整个*数组的最大连续之和*/currentSum = DutMax<ll>(currentSum + A[i], A[i]);result = DutMax<ll>(result, currentSum);}return result;
}

      用到的模板函数:

template <typename T>
T DutMax(T data1, T data2)
{return data1 > data2 ? data1 : data2;
}

编程之美2.14 求数组的子数组之和的最大值相关推荐

  1. 编程之美 2.14求数组的子数组之和的最大值

    对于一个有N个元素的数组,a[0]~a[n-1],求子数组最大值. 如:数组A[] = [−2, 1, −3, 4, −1, 2, 1, −5, 4],则连续的子序列[4,−1,2,1]有最大的和6. ...

  2. Programe_Of_Beauty:2.14 求数组的子数组之和的最大值

    问题:一个有N个整数元素的一维数组,那么求子数组和的最大值. 分析:首先我们明确问题,子数组是联系的,不用返回元素的位置,元素是整数,可能为正,负或0.我们来看看最经典的解法:a[0],a[1]-a[ ...

  3. 求数组的子数组之和的最大值

    一个有N个整数元素的一维数组( A[0], A[1], ... , A[n-2], A[n-1]),子数组之和的最大值是什么?(要求子数组的元素是连续的) 例子:有数组( -2, 5, 3, -6, ...

  4. 算法-求数组的子数组之和的最大值

    一个一维int数组,这个数组有很多子数组,那么子数组之和的最大值是什么呢? 思考 1.题目说的子数组是连续的: 2.题目只需要求和,并不需要返回子数组的具体位置: 3.数组的元素是整数,所以数组可能包 ...

  5. 求数组的子数组之和的最大值IV

    在之前的基础上又安排了二维数组的,在课上一开始是理解错要求了,简单的以为用循环数组就能解决,但是却忽视了子数组是否能构成矩形,之后课下和同学们讨论,主要是多重遍历,但是我还是没搞明白怎么构成新的二维数 ...

  6. 编程之美-求数组的子数组之和的最大值方法整理

    [试题描述] 方法一: 上面这个算法的时间复杂度为O(n^3),改进后如下: 此时算法的时间复杂度为O(n^2) 方法二:时间复杂度O(nlogn) 方法三:时间复杂度O(n) 改进一下,可以得到空间 ...

  7. 编程之美-2.14-求数组的子数组之和的最大值

    这个以前写过,见求数组的最长子数组之和的最大值 这里说一下后面扩展题目. 1. 简述 1) 如果数组首尾相连,即允许找到一组数字(A[i],···,A[n-1], A[0],···, A[j]),请使 ...

  8. 【C】课堂结对联系-求整数数组的子数组之和的最大值(党云龙、黄为)

    测试题目 求整数数组的子数组之和的最大值. 题目分析 首先是明确题目的目的:求最大值:其次是考虑子数组求和.这里将求最大值写成一个单独的函数.主函数未测试函数.这里用到了二重循环,时间复杂度为N^2. ...

  9. 编程之美4:求数组中的最大值和最小值

    方法1:暴力方法 遍历一遍数组,比较2*N次求出最大值和最小值 方法2:改进方法 (破坏了原数组)             遍历一遍数组使得下标为偶数的元素较下标为奇数的元素大,再分别求出最大值和最小 ...

最新文章

  1. 非平衡数据集的机器学习常用处理方法
  2. S如何边缘控制_如何用尼康佳能索尼人像标头50mm/1.8拍出大片的效果?
  3. 【RabbitMQ】2、心得总结,资料汇总
  4. 还亲力亲为的蜡笔小新
  5. Qt文档阅读笔记-QThread::setPriority(Priority priority)官方解析及实例
  6. STM32 位段详解
  7. Leetcode每日一题:104.maximum-depth-of-binary-tree(二叉树的最大深度)
  8. 【Linux】awk处理变量
  9. 2021-05-06 git 设置XX门8580端口代理访问github
  10. 以下创建了几个对象_面试题系列第2篇:new String()创建几个对象?
  11. 中国目前拥有的物种和人造卫星的作用
  12. js获取map对象的key和value
  13. 如何不出门就可以看遍中国各个城市的美景?
  14. Python:Turtle图形绘制
  15. using的三种用法
  16. speedoffice(Word)如何调整页边距
  17. CSAPP第七章家庭作业(原书第二版)
  18. bigquant量化平台笔记
  19. day13-event2
  20. 天有不测风云 | 智能车线上比赛一些意外情况

热门文章

  1. server side render
  2. redis主备同步(使用)
  3. 《Xcode实战开发》——2.8节调试区域
  4. 联想笔记本电脑的F1至F12键盘问题。怎么设置才能不按FN就使用F1
  5. 第二届团体程序设计天梯赛
  6. java面试第十五天
  7. 同花顺函数API(转载)
  8. Asp.Net 上传大文件专题(3)--从请求流中获取数据并保存为文件[下]
  9. java多附件上传 实例demo
  10. C++ Builder初学问与答(十三)