经典面试题 之 子数组之和最大值
因为最近要开始笔试和面试了,我觉得,很有必要做好准备~
这个问题是我在网上看到的,13年一家公司的笔试题,求子数组的最大和。这个题我之前在微软的编程之美看到过,不过当时记得并不是很深刻。
现在既然看到了,我就好好的想了想。考试题如下:
上面只给了两行代码的空间,也就是说,只需要两行的代码即可。
对于这个问题,有种很简单,但是效率最低的方法,就是枚举出全部的子数组,并且求和,比较出最大值。我当初写的代码就是这个版本的,现在应该在实验室的电脑里。
但是,在《编程之美》中,对于这个问题提供了三种解法,而且其中的第三种是效率最高的。时间复杂度O(n),空间复杂度为O(1)。
其实可以考虑一种比较极端的情况,就是,只有两个数,A[0] and A[1]。
这样,最大值存在的情况,无非就是:A[0], A[0] + A[1], A[1]。
这个过程基本就是三个数字中,找到最大值的过程。
然后推广到n的时候,从0->n - 1遍历只要重复这个过程,就能简单的获取到最终的最大值。
那么如何推广?
假设现在有三个数字A[3]:A[0] A[1] A[2].
这样先比较前两个元素,A[0],A[1],以及A[0] + A[1]。因为下次的比较需要将前面的A[0]+A[1]作为一个整体加入到下一次的比较中,所以需要有一个值能够用来表示其和。这个变量就是上面的nStart。
nAll则是相当于每次比较中的A[0]。那么每次的比较的顺序就是:A[1]和A[0] + A[1]比较。nStart取其最大值,然后在和相当于A[0]的nAll比较。如此往复,当线性遍历结束的时候,就成功的获取到了最大值。
这个方法相当巧妙,其中很多的细节都要自己慢慢的体会。
程序演示截图:
程序代码:
1 #include <iostream> 2 3 using namespace std; 4 #define max(a, b) (a) > (b) ? (a) : (b) 5 int MaxSubArray(int * A, int n) 6 { 7 int nStart = A[0]; 8 int nAll = A[0]; 9 for(int i = 1;i < n;++ i) 10 { 11 nStart = max(A[i], nStart + A[i]); 12 nAll = max(nStart, nAll); 13 } 14 return nAll; 15 } 16 int main() 17 { 18 cout << "Hello world!" << endl; 19 int array[] = {10, -1, 3, -11, -20, 33, 1, -6, 13}; 20 cout << MaxSubArray(array, sizeof(array)/sizeof(int)) << endl; 21 return 0; 22 }
转载于:https://www.cnblogs.com/matrix-r/p/3319053.html
经典面试题 之 子数组之和最大值相关推荐
- 编程之美2.14 求数组的子数组之和的最大值
这是一个在面试中出现概率很高的一道题目,就拿我来说吧,面试了5家公司中,两家公司问了这道题目,可见,这道题目是非常经典的. 解题思想也不是很难,我熟悉的有:两种解题办法: ...
- 《团队开发一(求一个数组的连续的子数组之和的最大值)》
<团队开发一(求一个数组的连续的子数组之和的最大值)> (1)设计思想:一般的,求一个数组的最大子数组之和即是按数组顺序依次让前几个数的和与下一个数进行比较,设一变量来装每次比较后的较大的 ...
- 编程之美-2.14-求数组的子数组之和的最大值
这个以前写过,见求数组的最长子数组之和的最大值 这里说一下后面扩展题目. 1. 简述 1) 如果数组首尾相连,即允许找到一组数字(A[i],···,A[n-1], A[0],···, A[j]),请使 ...
- 求数组的子数组之和的最大值
一个有N个整数元素的一维数组( A[0], A[1], ... , A[n-2], A[n-1]),子数组之和的最大值是什么?(要求子数组的元素是连续的) 例子:有数组( -2, 5, 3, -6, ...
- 编程之美 2.14求数组的子数组之和的最大值
对于一个有N个元素的数组,a[0]~a[n-1],求子数组最大值. 如:数组A[] = [−2, 1, −3, 4, −1, 2, 1, −5, 4],则连续的子序列[4,−1,2,1]有最大的和6. ...
- 【C】课堂结对联系-求整数数组的子数组之和的最大值(党云龙、黄为)
测试题目 求整数数组的子数组之和的最大值. 题目分析 首先是明确题目的目的:求最大值:其次是考虑子数组求和.这里将求最大值写成一个单独的函数.主函数未测试函数.这里用到了二重循环,时间复杂度为N^2. ...
- 算法-求数组的子数组之和的最大值
一个一维int数组,这个数组有很多子数组,那么子数组之和的最大值是什么呢? 思考 1.题目说的子数组是连续的: 2.题目只需要求和,并不需要返回子数组的具体位置: 3.数组的元素是整数,所以数组可能包 ...
- C++求数组子数组和的最大值并将该子数组和最大值打印出来
#include <iostream> using namespace std; void GetMaxValue(int *pDatas, int len); void main() { ...
- Minimum Size Subarray Sum 最短子数组之和
题意 Given an array of n positive integers and a positive integer s, find the minimal length of a suba ...
最新文章
- WebSocket 协议
- Android报错:java.lang.IllegalArgumentException: Surface was abandoned
- Linux系统下SSH服务启动失败故障处理
- Hystrix全局配置默认超时时间
- 软件设计模式六大原则之四接口隔离原则(PHP语言实现)
- LeetCode MySQL 1141. 查询近30天活跃用户数
- cubic差值matlab,matlab自带的插值函数interp1的四种插值方法
- 天猫双11:1日到11日0点45分 382个品牌成交额超过1亿元
- CSS hover 改变另外一个元素状态
- ResourceBundle使用详解
- PIN/PAD Design in SoC - 2 (待续)
- 架构师应该知道的37件事
- gmail邮箱注册成功流程
- java计算机毕业设计基于安卓/微信小程序的健身房健身管理系统
- 【总结】信息安全工程师第二版-第1章 网络信息安全概述-03
- 三维重建(5)之三角测量计算双目相机坐标系下三维坐标
- github项目管理和贡献代码
- 数据库------DQL操作
- 中小微企业的信贷决策
- 服务器中病毒要不要重装系统,五种情况必须要给电脑重装系统,这三种不用重做系统,别被骗了...