【剑指Offer】面试题42. 连续子数组的最大和
时间:2020-04-19
本文章向大家介绍【剑指Offer】面试题42. 连续子数组的最大和,主要包括【剑指Offer】面试题42. 连续子数组的最大和使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目
输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。
要求时间复杂度为O(n)。
示例1:
输入: nums = [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
提示:
- 1 <= arr.length <= 10^5
- -100 <= arr[i] <= 100
思路一:DP
求出以每个位置结尾的子数组最大值,对于每个位置,如果以前一个位置数结尾的最大值小于0,则以当前位置结尾数的最大值为自身,否则为当前数加上以前一个数结尾的子数组最大值。然后更新最终最大值res。
dp[i]:表示以i位置数结尾的子数组最大值。
代码
时间复杂度:O(n)
空间复杂度:O(1)
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int size = nums.size();
vector<int> dp(nums);
int res = nums[0];
for (int i = 1; i < size; ++i) {
if (dp[i - 1] < 0) {
dp[i] = nums[i];
} else {
dp[i] = dp[i - 1] + nums[i];
}
res = max(res, dp[i]);
}
return res;
}
};
优化空间
用pre保留前一个子数组最大值。
空间复杂度:O(1)
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int size = nums.size(), res = nums[0], pre = nums[0];
for (int i = 1; i < size; ++i) {
pre = max(pre + nums[i], nums[i]);
res = max(res, pre);
}
return res;
}
};
原文地址:https://www.cnblogs.com/galaxy-hao/p/12733170.html
- 使用jQuery Uploadify在ASP.NET 上传附件
- 利用SSH Filesystem实现远程文件系统
- 来看看机智的前端童鞋怎么防盗
- qq平台登录
- 重构实践:体验interface的威力(二)
- Visual Studio 2013 Web开发
- 初识Opserver,StackExchange的监控解决方案
- OstrichNet 简易统计信息收集工具
- 百度地图开发1
- 开源消息队列:NetMQ
- 自然语言处理如何检查拼写错误?(Tensorflow实例教程、源代码)
- 仿qq登录界面
- 搭建Linux+Jexus+MariaDB+ASP.NET[LJMA]环境
- WindowsMobile/Win Form-界面自适应
- 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 数组属性和方法
- Linux系统下快速配置HugePages的完整步骤
- 解决Linux Tensorflow2.0安装问题
- 工作中常用到的Linux命令总结
- Linux中把用户添加到组的4个方法总结
- Linux下配置jdk环境的方法
- Ubuntu 16.04/18.04 安装Pycharm及Ipython的教程
- linux系统对外开放3306、8080等端口,防火墙设置详解
- Linux中selinux基础配置教程详解
- Linux中如何查看已挂载的文件系统类型详解
- 在 Linux 命令行中使用 tcpdump 抓包的一些功能
- CentOS平台快速搭建LAMP环境的方法
- Linux系统中时间的获取和使用
- 基于Linux搭建Apache网站服务配置详解
- CentOs下手动升级node版本的方法
- 详述Linux中Firewalld高级配置的使用