【LeetCode】-- 剑指 Offer 42. 连续子数组的最大和

简介: 【LeetCode】-- 剑指 Offer 42. 连续子数组的最大和

1. 题目

输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。

2. 示例

输入: nums = [1,-2,3,10,-4,7,2,-5]

输出: 18

解释: 连续子数组 [3,10,-4,7,2] 的和最大,为 18。

3. 分析

第i位连续子数组的最大和,要看第i-1位连续子数组的最大和对第i位来说有没有增益:

(1)假如第i-1位的连续子数组的最大和为正,那么一定对第i位有增益,连续子数组最大和为第i-1位的连续子数组的最大和+第i位数据

(2)假如第i-1位的连续子数组的最大和为负,那么对第i位没有增益,就舍弃掉第i-1位的连续子数组最大和,只留下第i位数据成为连续子数组最大和

所以,可以提炼一个函数:

Fun(i) = max(Fun(i-1)+a[i-1],a[i-1])

其中:i代表数组第i位,i-1就是数组下标

(3)得到每一位元素的连续子数组的最大和之后,再从他们中找到最大的那一个

4. 代码实现

1. class Solution {
2. public:
3. int maxSubArray(vector<int>& nums) {
4.         vector<int> sum;
5.         sum.resize(nums.size()+1);//需要多分配一个空间
6. 
7. //计算每一个元素的最大连续子数组和
8. for(size_t i = 1;i<sum.size();i++)
9.         {
10.             sum[i] = max(sum[i-1]+nums[i-1],nums[i-1]);
11.         }
12. 
13. //从最大连续子数组和中挑出最大的
14. int max = sum[1];//不赋值sum[0]的原因是,如果nums数组本来全都是负数,那么最大连续子数组和全为负数,而sum[0]本来就是0,如果给max赋初值为sum[0],那么nums的每个元素的最大连续子数组和都为负数,sum[0]就成了整个数组的最大连续子数组和
15. 
16. for(size_t i = 1;i<sum.size();i++)
17.         {
18. if(sum[i] > max)
19.             {
20.                 max = sum[i];
21.             }
22.         }
23. 
24. return max;
25.     }
26. };


相关文章
|
1月前
|
存储 算法
LeetCode刷题---209. 长度最小的子数组(双指针-滑动窗口)
LeetCode刷题---209. 长度最小的子数组(双指针-滑动窗口)
|
2天前
【LeetCode刷题】滑动窗口思想解决问题:长度最小的子数组、无重复字符的最长子串
【LeetCode刷题】滑动窗口思想解决问题:长度最小的子数组、无重复字符的最长子串
|
20天前
|
存储
【LeetCode】剑指 Offer 54. 二叉搜索树的第k大节点
【LeetCode】剑指 Offer 54. 二叉搜索树的第k大节点
21 1
|
1月前
|
索引
leetcode代码记录(最长重复子数组
leetcode代码记录(最长重复子数组
15 0
|
1月前
leetcode代码记录(长度最小的子数组
leetcode代码记录(长度最小的子数组
18 0
|
1月前
|
算法 DataX
二叉树(中)+Leetcode每日一题——“数据结构与算法”“剑指Offer55-I. 二叉树的深度”“100.相同的树”“965.单值二叉树”
二叉树(中)+Leetcode每日一题——“数据结构与算法”“剑指Offer55-I. 二叉树的深度”“100.相同的树”“965.单值二叉树”
|
1月前
|
算法 定位技术
【leetcode】剑指 Offer II 105. 岛屿的最大面积-【深度优先DFS】
【leetcode】剑指 Offer II 105. 岛屿的最大面积-【深度优先DFS】
22 0
|
1月前
【力扣】209. 长度最小的子数组
【力扣】209. 长度最小的子数组
|
1月前
|
算法 测试技术
每日一题:LeetCode-209. 长度最小的子数组(滑动窗口)
每日一题:LeetCode-209. 长度最小的子数组(滑动窗口)
|
1月前
|
算法
LeetCode题:581. 最短无序连续子数组,242. 有效的字母异位词,202. 快乐数
LeetCode题:581. 最短无序连续子数组,242. 有效的字母异位词,202. 快乐数
32 0