求连续子数组的最大和

一、题目:

  这是一道考的烂的不能再烂的题目,但是依然有很多公司乐于将这样的题目作为笔试或面试题,足见其经典。 问题是这样的:一个整数数组中的元素有正有负,在该数组中找出一个连续子数组,要求该连续子数组中各元素的和最大,这个连续子数组便被称作最大连续子数组。比如数组{2,4,-7,5,2,-1,2,-4,3}的最大连续子数组为{5,2,-1,2},最大连续子数组的和为5+2-1+2=8。

二、解法:

  解法一:暴力求解法

/*
 (1) 常规方法,时间复杂度O(n*n)
 (2) 先从第一个元素开始向后累加,
 (3)每次累加后与之前的和比较,保留最大值,
 (4) 再从第二个元素开始向后累加,以此类推
*/

 public static int maxSubSum1(int[] arr, int len) {
        int i, j;
        int maxSum = 0;
        //每次开始累加的起始位置的循环
        for (i = 0; i < len; i++) {
            int curSum = 0;
            //向后累加的循环
            for (j = i; j < len; j++) {
                curSum += arr[j];
                if (curSum > maxSum)
                    maxSum = curSum;
            }
        }
        return maxSum;
    }

解法二:线性时间算法(推荐)

  /*
(1)  最优方法,时间复杂度O(n)
 (2) 和最大的子序列的第一个元素肯定是正数
 (3) 因为元素有正有负,因此子序列的最大和一定大于0
   */
 public static int maxSubSum(int[] arr, int len) {
        int i;
        int maxSum = 0;
        int curSum = 0;//子数组的和
        for (i = 0; i < len; i++) {
            curSum += arr[i];
            if (curSum > maxSum)
                maxSum = curSum;
            //如果累加和出现小于0的情况,
            //则和最大的子序列肯定不可能包含前面的元素,
            //这时将累加和置0,从下个元素重新开始累加
            if (curSum < 0)
                curSum = 0;
        }
        return maxSum;
    }

时间: 2024-10-13 15:59:50

求连续子数组的最大和的相关文章

最大子数组问题(求连续子数组的最大和)

在<算法导论>第四章分治策略(Divider and Conquer)4.1节提出了最大子数组问题.其转化就是求数组a={1, -2, 3, 10, -4, 7 , 2, -5}中连续子数组的最大和. 对于这个问题,很容想到一种暴力求解的方法:简单地尝试对所有可能的的组合进行求和.对数组为n存在n*(n-1)/2中组合,然后对每个组合进行求和.即三个for循环遍历,求出数组中每一个子数组的和,最终求出这些子数组的最大的一个值.记Sum[i,...,j]为数组a中第i个元素到第j个元素的和(其中

分治法求连续子数组的最大和

思路来自算法导论,将数组平分为左右两个子数组,那么最大子数组可能在左边的子数组中,也有可能在右边的子数组中,还有可能跨过中间的元素,只有这三种情况.对于前两种情况,可以使用递归求解,对于第三种情况,可以做到用线性时间复杂度的函数来求解,详见代码. #include <iostream> #include <map> using namespace std; //the thought of this algrithm is devide-and-couque int int_max

剑指offer面试题31连续子数组的最大和

一.题目描述 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决.但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止).你会不会被他忽悠住? 二.解题思路 求连续子数组的最大和,首先想的到最笨的方法就是暴力解决,两个for循环,遍历数组找到和最大的子

连续子数组的最大和问题

参考自:求连续子数组的最大和 求子数组的最大和题目描述:输入一个整形数组,数组里有正数也有负数.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值.要求时间复杂度为O(n). 例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18. 思路 一.暴力求法 计算每一个子数组的和,然后求最大值,复杂度O(n3).不推荐,代码就不写了. 二. 动态规划 设sum[i]为以第i个

连续子数组的最大和Java实现

问题描述: 一个数组有 N 个元素,求连续子数组的最大和. 例如:[-1,2,1],和最大的连续子数组为[2,1],其和为 3 本文采用的是数组,利用等差数列进行求和,代码如下: package series00; import java.util.Arrays;import java.util.Scanner; public class series1 { public static void main(String[] args) { //准备数据 System.out.println("请

Task 4 求数组的连续子数组的最大和(团队合作)

小组成员:李敏.刘子晗 1.设计思想:由于已经做过这个题目,只要对之前的程序加上相应的测试和约束即可.我们两个人一起商议后,决定了程序的主框架和并列出了最终可以实现的功能.先要定义数组长度和上下限的变量,然后通过if语句对用户所给出的长度和数值进行判断看是否合法,如果不合法要重新输入.最后再加上之前求和的相应代码即可. 2.出现的问题:我们达成协议后,李敏负责编程,我负责测试.开始写程序,在写判断数值是否满足int整型范围的时候出现了错误,我在测试的时候发现她把小于号错写成了大于号,然后加以改正

求数组中任何连续子数组的最大和,并打印最大子数组(求开始和结束下标)

//计算数组中任何连续子数组的最大和,并打印最大子数组(求开始和结束下标) //思路:1:当数组元素全为0时,输出最大的那个负数 //      2:当数组有正有负时,i=0遍历数组,从大于0的那个元素开始,记录此时的下标为shart(最大子数组起始下标),从start开始遍历剩下的元素,若元素和num大于max的值则更新max, //    且将此时的下标赋值给end(最大子数组终止下标),当num小于0则说明后面出现的(如果出现)最大子数组不可能包含这些元素,所以退出内层循环,继续外层循环,

关于求已知整数数组的连续子数组的最大和的方法

日期:2019.3.9 博客期:039 星期六 这次的标题就是题目——关于求已知整数数组的连续子数组的最大和的方法,打个比方:给予数组 { 1 , -2 , 3 , -1 , 0 , 2 } ,它的连续子数组的最大和就是取得 { 3 , -1 , 0 , 2 } 时的和 4 !就是说我们需要找到元素值和最大的子数组.我们大可以考虑几种方法: (1)先求出所有的子数组,再找出每一组的和,求出和的最大值 >>>>>>>(优化)>>>>>&

求数组中连续子数组的最大和

问题: 求解数组中连续一段子数组和的最大值.例如:{31,-41,59,26,-53,58,97,-93,-23,84},最大值为59+26-53+58+97=187 思路: 计算出任意i到j之间连续子数组的和再比较必然能得到最大值,但时间复杂度为O(n^2),我们希望能找出线性时间的算法. 我们注意到,假如数组中全为正数,那么最大和必然为全部数相加:如果数组中有负数,并且如果加上某个负数,子数组的和小于0,则最大和子数组必然不包含这个负数. 基于此,给出以下代码: //计算数组中任何连续子数组