剑指offer代码解析——面试题31连续子数组的最大和
时间:2022-05-03
本文章向大家介绍剑指offer代码解析——面试题31连续子数组的最大和,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目:输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组和的最大值。要求时间复杂度为O(n)
分析:统计连续子数组的最大值最直观的方法就是遍历数组n次,每次以a[i]作为子数组的起点,然后将a[i]后面的数字依次纳入数组中,计算最大值。这种方式的时间复杂度为O(n^2),显然不符合要求。下面我们根据数组自身的特点来统计连续子数组的最大值。
我们尝试从左向右遍历数组,并且进行累加。我们就会发现:如果当数组累加到a[i]后,累加的结果反而小于a[i]本身,那就说明a[0]+……+a[i-1]是一个负数。那么这个负数会拖累a[i]后面累加的结果,即:a[0]+……+a[i-1]+a[i]+……+a[n] < a[i]+……+a[n]。既然如此,当我们发现累加进行到a[i]时,如果累加的结果反而小于a[i]本身,就把a[i]前面的所有数全都丢掉,累加从a[i]重新开始。与此同时,用一个全局变量记录当前子数组的最大值。那么当扫描完一遍数组后,那个最大值就是我们要的结果。代码如下:
/**
* 题目:输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)
* @author 大闲人柴毛毛
* @date 2016年3月16日
*/
public class MaxSubArray {
/**
* 计算子数组和的最大值
* @param a 数组
* @return 返回子数组和的最大值
*/
private static boolean result = true;//用于标识本函数运行过程是否正常
public static int getMaxSubArray(int[] a){
//数组为空
if(a==null || a.length<=0){
System.out.println("数组为空!");
result = false;
return -1;
}
int max = 0;//记录当前子数组最大值
int sum = 0;//记录当前子数组的和
//扫描数组
for(int i=0;i<a.length;i++){
//计算当前子数组的和
sum += a[i];
//若a[i]比sum大
if(a[i]>sum){
//丢掉a[i]之前累加结果,把a[i]作为子数组的起点
sum = a[i];
max = a[i];
}
//若a[i]比sum小,则判断sum是否>max,若sum>max,则更新max
if(sum > max)
max = sum;
}
return max;
}
/**
* 测试
*/
public static void main(String[] args){
int[] a = {1,-2,3,10,-4,7,2,1,-5};
System.out.println("函数执行结果:"+result);
System.out.println("最大值="+getMaxSubArray(a));
}
}
运行结果:
函数执行结果:true
最大值=19
- Android基础:Fragment,看这篇就够了
- Rest api简介
- crossdomain.xml文件配置不当利用手法
- Android 常用的ORM框架详解
- 测试全球最安全的手机Blackphone
- 国产SSL防火墙 – sslfw
- Android 之dragger使用
- Android图像处理 - 高斯模糊的原理及实现
- 走进科学:银行ATM机真的安全吗?
- 漏洞科普:对于XSS和CSRF你究竟了解多少
- 巧用Live Template,不仅能提升AS开发效率,还能装逼
- 黑了前男友网站:从找SQL注入到后台权限
- 扩展CakePHP的CacheHelper以使用缓存引擎
- 走进科学:酒店保险箱真的保险么?
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 威胁事件告警分析技巧及处置(二)
- 组复制安全 | 全方位认识 MySQL 8.0 Group Replication
- 那些年我们遇的bug
- Spring 里那么多种 CORS 的配置方式,到底有什么区别
- oracle 数据库:"ORA-01940: 无法删除当前连接的用户",解决办法
- 不要在Spring单元测试中使用 @Transactional注解
- OpenCV DNN模块官方教程(一)加载Caffe模型做图像分类
- Python爬虫之mongodb的聚合操作
- Linux中文输入法-搜狗输入法安装方法
- oracle 数据库问题:"ORA-01922: 必须指定 CASCADE 以删除...",原因及解决办法
- OpenCV DNN模块官方教程(二)YoloV4目标检测实例
- Python爬虫之mongodb的增删改查
- 恕我直言你可能真的不会java第2篇:Java Stream API?
- Python爬虫之mongodb的简单使用
- Java之美-死锁