【剑指offer】42、连续子数组的最大和

题目

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

思路一

试着从头到尾累加每个数字,若发现有子数组和小于零,则加上后面的数字肯定会变小

因此丢弃这组子数组,从后面一个数字开始重新累加

例如{1,-2,3,10,-4,7,2,-5}

1+(-2)=-1

3+10-4+7+2=18

3+10-4+7+2-5=13

因此是18

需要注意的是,记录最大值的初始值要设置成INT_MIN,因为最大值可能是负数。

class Solution {
public:
    int FindGreatestSumOfSubArray(vector<int> array) {
        if (array.size() == 0)
            return 0;
        // 数组中最大值可以是负数,因此最大值不能设成0
        int sum = 0, max = INT_MIN;
        int len = array.size();
        for (int i = 0; i < len; i++){
            if (sum < 0){
                sum = array[i];  // 从下一个数字开始累加
            }
            else {
                sum = sum + array[i];
            }
            if (sum > max){  // 记录最大值
                max = sum;
            }
        }
        return max;
    }
};

思路二

也可以用动态规划做,其实和前面思想类似。

用f(i)表示以i结尾的子数组最大和

class Solution {
public:
    int FindGreatestSumOfSubArray(vector<int> array) {
        if (array.size() == 0)
            return 0;
        int f = array[0], sum = array[0];
        for (int i = 1; i < array.size(); i++){
            if (f <= 0)
                f = array[i];
            else
                f = f + array[i];
            sum = (f > sum)? f: sum;
        }
        return sum;
    }
};

原文地址:https://www.cnblogs.com/shiganquan/p/9346322.html

时间: 2024-10-09 01:22:07

【剑指offer】42、连续子数组的最大和的相关文章

剑指Offer:连续子数组的最大和

题目: 输入一个整型数组, 数组里有正数也有负数. 数组中的一个或连续的多个整数组成一个子数组. 求所有子数组的和的最大值. 要求时间复杂度为O(n) #include <stdio.h> int maxsum_subarray(int a[], int n) { if( a==NULL || n<=0 ) { printf("Error.\n"); return 0x80000000; } int i; int curmax = 0x80000000; int cu

【剑指Offer】连续子数组的最大和

问题描述 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决.但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止).你会不会被他忽悠住? 算法分析 有一个temp用于探路,sum负责保存最终值,初始都为数组第一个数: 每一轮循环里, temp如果小于

剑指offer30:连续子数组的最大和

1 题目描述 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决.但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止).给一个数组,返回它的最大连续子序列的和,你会不会被他忽悠住?(子向量的长度至少是1). 2 思路和方法, C++核心代码 2.1

【剑指offer】连续子数组最大和

思路dp很清楚,就是要注意细节. int FindGreatestSumOfSubArray(vector<int> array) { if(array.empty()) return 0; int sum = array[0], tempsum = array[0]; //注意初始值 不能设为0 防止只有负数 for(int i = 1; i < array.size(); i++) //从1开始 因为0的情况在初始化时完成了 { tempsum = (tempsum < 0)

【剑指offer】面试题 42. 连续子数组的最大和

面试题 42. 连续子数组的最大和 NowCoder 题目描述 输入一个整型数组,数组里有正数也有负数.数组中一个或连续的多个整数组成一个子数组.求所有子数组的和的最大值. 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6. 注意: 要求时间复杂度为 O(n). Java 实现 public class Solution { public int FindGreatestSumOfSubArray(int[]

动态规划:面试题42. 连续子数组的最大和

面试题42. 连续子数组的最大和 题目要求: 解题思路: 1. 定义子问题: dp[i] 为下标以 num[i] 结尾的数组字段 元素最大最短和,i表示子段到当前i位置 i: 2. 寻找关系式: 只有一个元素:dp[0] = num[0]; 两个元素:dp[i] 为num[0], num[1], num[0]+num[1]; 三个元素时:考虑前三个元素,如何求其最?大?子段和?还是分为两种情况讨论,第三个元素在最后的字串串内吗? 若第三个元素也包含在最后的字串串内,则dp[2] = max(dp

剑指OFFER----面试题42. 连续子数组的最大和

链接:https://leetcode-cn.com/problems/lian-xu-zi-shu-zu-de-zui-da-he-lcof/submissions/ 代码: class Solution { public: int maxSubArray(vector<int>& nums) { int res = INT_MIN, s = 0; for (auto x: nums) { if (s < 0) s = 0; s += x; res = max(res, s);

剑指OFFER之最大子向量和(连续子数组的最大和)(九度OJ1372)

题目描述: HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天JOBDU测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决.但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止).你会不会被他忽悠住? 输入: 输入有多组数据,每组测试数据包括两行. 第一行为一个整数n(0<=n<=100000),当

剑指Offer对答如流系列 - 连续子数组的最大和

面试题42:连续子数组的最大和 题目描述 输入一个整型数组,数组里有正数也有负数.数组中一个或连续的多个整/数组成一个子数组.求所有子数组的和的最大值.要求时间复杂度为O(n). 问题分析 输入数组{1.-2.10.-4.7.2.-5} 很容易看出从第一个数字开始累加,若走到某一个数字时,前面的累加和为负数,说明不能继续累加了.比如1 和 -2累加后值为-1,后面的数字加上-1反而变小了,应舍弃.要从接下来的数字重新开始累加.注意在累加过程中,将每次累加和的最大值记录下来,遍历完成后,返回该数字

剑指Offer面试题:28.连续子数组的最大和

一.题目:连续子数组的最大和 题目:输入一个整型数组,数组里有正数也有负数.数组中一个或连续的多个整数组成一个子数组.求所有子数组的和的最大值.要求时间复杂度为O(n).例如输入的数组为{1,-2,3,10,-4,7,2,-5},和最大的子数组为{3,10,-4,7,2},因此输出为该子数组的和18. 这个题目在我去年参加校园招聘时,某公司的二面采用了机试,而题目刚好就是这道题.一般看到这道题目就会想到枚举出数组的所有子数组并求出它们的和.一个长度为n的数组,总共有n(n+1)/2个子数组.计算