LintCode 题解丨阿里巴巴面试高频题:最大子数组

简介: LintCode 题解丨阿里巴巴面试高频题:最大子数组

给定一个整数数组,找到一个具有最大和的子数组,返回其最大和。

样例1:

输入:[−2,2,−3,4,−1,2,1,−5,3]
输出:6
解释:符合要求的子数组为[4,−1,2,1],其最大和为 6。
样例2:

输入:[1,2,3,4]
输出:10
解释:符合要求的子数组为[1,2,3,4],其最大和为 10。
在线评测地址:

LintCode 领扣

算法
贪心

算法分析

题目要求给定一个整数数组,找到一个具有最大和的子数组,返回其最大和。若直接暴力枚举子数组,时间复杂度需要 O(N2);
由于题目要求是子数组最大和,因此可以利用贪心思想,通过局部的子数组最大,进而得到整体的最优解;
需要注意贪心的策略不能有后效性;
算法步骤

定义 maxAns 记录全局最大值,即结果;sum 记录当前子数组的和;
初始化: maxAns=Integer.MIN_VALUE; sum=0;
因为数组可以全为负数,因此maxAns不能直接初始化为0;

遍历整数数组:
Sum 累加当前的值;
若当前 sum>maxAns ,更新 maxAns=sum;
若当前 sum<0 ,表示当前的子数组和已经为负,累加到后面会使和更小,因此令 sum=0,相当于放弃当前的子数组,重新开始;
复杂度

时间复杂度:O(N),N为数组长度
只需要遍历一遍数组就能找到答案;
空间复杂度:O(1)
只需要用到maxAns和sum两个变量.
public class Solution {

/**
 * @param nums: A list of integers
 * @return: A integer indicate the sum of max subarray
 */
public int maxSubArray(int[] nums) {

    // maxAns记录全局最大值 sum记录当前子数组的和
    int maxAns = Integer.MIN_VALUE, sum = 0;
    // 贪心
    for (int i = 0; i < nums.length; i++) {
        sum += nums[i];
        maxAns = Math.max(maxAns, sum);
        sum = Math.max(sum, 0);
    }

    return maxAns;
}

}
更多题解参考:九章算法官网

相关文章
|
1月前
|
算法
【数组相关面试题】LeetCode试题
【数组相关面试题】LeetCode试题
|
1月前
|
存储
力扣面试经典题之数组/字符串
力扣面试经典题之数组/字符串
23 0
|
2月前
|
算法 前端开发
经典面试题:扁平化嵌套数组
经典面试题:扁平化嵌套数组
22 0
|
3月前
|
存储 JavaScript 前端开发
【面试题】JS的14种去重方法,看看你知道多少(包含数组对象去重)
【面试题】JS的14种去重方法,看看你知道多少(包含数组对象去重)
|
3月前
|
前端开发 JavaScript Java
【面试题】说说 JavaScript数组常见的操作 (20个)
【面试题】说说 JavaScript数组常见的操作 (20个)
|
1月前
|
存储 算法 Java
超全面!阿里巴巴最新发布23年秋招200道Java面试题(含答案)
马上过34岁生日了,和大家聊聊最近的情况 半年前还在迷茫该学什么,怎样才能走出现在的困境,半年后已经成功上岸阿里,感谢在这期间帮助我的每一个人。 面试中总结了200道经典的Java面试题,里面包含面试要回答的知识重点,并且我根据知识类型进行了分类,可以说非常全面了~ 因为篇幅原因,大部分的内容就不给大家一一展示了,需要获取的小伙伴可以直接点击此处取到! Java平台相关 1、JDK、JRE、JVM 分别是什么关系? 2、为什么 Java 被称作是“平台无关的编程语言”? 3、Java 和 C++ 的区别? 4、什么是字节码?采用字节码的最大好处是什么? 5、Java运行的过程? 6、
92 4
|
1月前
|
算法 测试技术 索引
力扣面试经典题之数组/字符串(二)
力扣面试经典题之数组/字符串(二)
13 0
|
2月前
|
JavaScript 前端开发 索引
【JavaScript】面试手撕数组原型链(易)
续借上文,这篇文章主要讲的是数组原型链相关的考题,有些人可能会纳闷,数组和原型链之间有什么关系呢?我们日常使用的数组forEach,map等都是建立在原型链之上的。举个🌰,如我有一个数组const arr = [1,2,3]我想要调用arr.sum方法对arr数组的值进行求和,该如何做呢?我们知道数组没有sum函数,于是我们需要在数组的原型上定义这个函数,才能方便我们调用,具体代码如下。接下来我们就是采用这种方式去实现一些数组常用的方法。
39 6
|
2月前
|
JavaScript 前端开发
【JavaScript】面试手写题精讲之数组(上)
该专题主要是讲解我们在面试的时候碰到一些JS的手写题, 确实这种手写题还是比较恶心的。有些时候好不容易把题目写出来了,突然面试官冷不丁来一句有没有更优的解法,直接让我们僵在原地。为了解决兄弟们的这些困扰,这个专题于是就诞生啦。我们会将一些常见的不是最优解的答案作为对比,方便大家更好理解。
38 3
|
3月前
|
NoSQL Java 关系型数据库
阿里巴巴Github星标57.9KJava面试突击汇总(全彩版)首次公开
Java面试 现在互联网大环境不好,互联网公司纷纷裁员并缩减HC,更多程序员去竞争更少的就业岗位,整的IT行业越来越卷。身为Java程序员的我们就更不用说了,上班8小时需要做好本职工作,下班后还要不断提升技能、技术栈,才能从容应对现在互联网公司的面试! 但事实是:很多Java程序员,对自身是没有一个清楚的认知的,甚至不知道自己短板在哪?这样不做准备的就去面试,你肯定会离心仪的offer越来越远!我今天写这篇文章的意义就在于劝诫大家如果面试准备阶段没有方向的话,不妨暂时停下来,看一下自己怎么才能更加系统、有条理地去备战面试,建立起一个系统的查漏补缺体系;怎么才能从自己的实际出发,了解自身与互联
54 0