`

最大连续子数组之和

 
阅读更多

一个有N个整数元素的一维数组( A[0], A[1], ... , A[n-2], A[n-1]),子数组之和的最大值是什么?(要求子数组的元素是连续的)

 

给人典型的动态规划的感觉。先求到前面i个元素的最大子数组之和max,然后在此基础上考虑i+1的情况,直至n位置。

 

public  class MaxSubArray{
    public static void main(String[] args){
        int[] a = new int[]{ -2, 5, 3, -6, 4, -8, 6};
        System.out.println(getMax(a));
    }
    public static int getMax(int[] a){
        //max保存的是最大值
        int max = a[0];
        //max2保存的是遍历过程中可能的最大值
        int max2 = a[0];
        for(int i=1;i<a.length;i++){
            //总共4种情况
            //1. a[i]>0,max2>0 : 这个时候二者相加是可能的最大值
            //2. a[i]>0,max2<0 :这个时候a[i]是可能的最大值
            //3. a[i]<0,max2>0 : 这个时候二者相加是可能的最大值
            //4. a[i]<0,max2<0 :这个时候a[i]是可能的最大值
            if(a[i]>=0){
                if(max2 >= 0){
                    max2 += a[i];
                }else{
                    max2 = a[i];
                }
            }else{
                if(max2 >= 0){
                    max2 += a[i];
                }else{
                    max2 = a[i];
                }
            }
            if(max2 > max){
                max = max2;
            }
        }
        return max;
    }
}

 

 

代码精简后

public  class MaxSubArray{
	public static void main(String[] args){
		int[] a = new int[]{ -2, 5, 3, -6, 4, -8, 6};
		System.out.println(getMax(a));
	}
	public static int getMax(int[] a){
		//max保存的是最大值
		int max = a[0];
		//max2保存的是遍历过程中可能的最大值
		int max2 = a[0];
		for(int i=1;i<a.length;i++){
			//max2大于0,则相加可能得到最大值
			if(max2 >= 0){
				max2 += a[i];
			}
			//max2小于0,则相加不可能达到最大值,直接取a[i]
			else{
				max2 = a[i];
			}
			//更新最大值
			if(max2 > max){
				max = max2;
			}
		}
		return max;
	}
}
 
分享到:
评论

相关推荐

    连续子数组的最大和

    从头到尾逐个累加示例数组中的每个数字。初始化和为0,第一步加上第一个数字1,...第八步加上最后一个数字-5,由于得到的和为13,小于此前最大和18,因此最终最大的子数组的和为18,对应的子数组是{3,10,-4,7,2}。

    数组中最大和的子数组

    这个问题的目标是找到数组中的一个连续子数组,使得这个子数组的所有元素之和最大。 首先,我们需要理解什么是子数组。在数组中,子数组是由数组中任意两个下标i和j(i )确定的一段连续元素的集合,即原数组的第i...

    最大和连续子数组1

    3. 当遍历结束后,`max_sum` 就是数组中的最大连续子数组和。 除了 Kadane's Algorithm,还可以使用分治策略的 Divide and Conquer(分而治之)方法来解决此问题,或者使用基于树状数组(Fenwick Tree)或前缀和的...

    算法-分治法求解最大子数组问题

    一个整数数组中的元素有正有负,在该数组中找出一个连续子数组,要求该连续子数组中各元素的和最大,这个连续子数组便被称作最大连续子数组。 随机产生1000以上的数据(有正有负),写入文件input.txt 比如数组{2,4,...

    求最大连续子数组.cpp

    求最大连续子数组.cpp

    连续最大子数组和1

    最后,函数返回 `maxval`,即整个数组中的最大连续子数组和。 这个解决方案的时间复杂度是 O(n),其中 n 是数组的长度,因为它只遍历一次数组。空间复杂度也是 O(n),因为使用了一个与数组长度相等的额外向量 `res`...

    连续子数组的和1

    在本文中,我们将深入探讨如何解决计算机科学领域中的一道经典问题——寻找连续子数组的最大和。这个问题通常出现在算法竞赛和面试中,例如在LeetCode等在线平台上的题目。我们将采用动态规划的方法来解决这个问题,...

    40.连续子数组的最大和1

    动态规划之连续子数组的最大和 连续子数组的最大和是动态规划中的一个经典问题,它们要求我们在给定的数组中找到一个连续的子数组,使得该子数组的和最大。这种问题的解决方法有很多,我们今天将介绍两种不同的方法...

    连续子数组的最大和.md

    连续子数组的最大和.md

    python求最大连续子数组的和

    【Python求最大连续子数组的和】这个问题是一个经典的算法问题,通常出现在数据结构和算法的课程中,也常被用于面试。这个问题的目标是找到一个数组中的连续子数组,使得这个子数组的元素之和最大。 首先,我们可以...

    c语言实现分治算法求解最大子数组

    自己写的分治算法,也包括了暴力求解的部分,并比较两者的运行时间,输出最大子数组的起始位置

    Python语言描述连续子数组的最大和

    问题的核心在于给定一个包含正数和负数的一维数组(向量),我们需要找到该数组的一个连续子数组(至少包含一个元素),使得该子数组的元素之和达到最大。例如,对于数组`{6, -3, -2, 7, -15, 1, 2, 2}`,连续子数组...

    java基础面试题连续子数组的最大和

    java基础面试题连续子数组的最大和本资源系百度网盘分享地址

    ACM例题,给定一个整数数组,找到一个具有最大和的连续子数组

    问题描述:给定一个整数数组,找到一个具有最大和的连续子数组。 解决方案:使用Kadane算法,该算法可以在O(n)时间复杂度内解决这个问题。 附件代码定义了一个maxSubArraySum函数,它接受一个整数数组nums作为参数...

    C语言程序:求子数组的最大和

    数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 求所有子数组的和的最大值。要求时间复杂度为O(n)。 例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2, 因此...

    乘积最大子数组(动态规划)1

    问题要求在给定的整数数组 `nums` 中找出乘积最大的连续子数组,并返回这个子数组的最大乘积。动态规划是一种解决复杂问题的有效方法,通过将大问题分解成小问题,然后逐步构建解决方案。 首先,我们要明确动态规划...

    python-剑指offer第30题连续子数组的最大和

    python python_剑指offer第30题连续子数组的最大和

    C语言求连续最大子数组和的方法

    本文实例讲述了C语言求连续最大子数组和的方法,是非常实用的技巧。分享给大家供大家参考。 具体实现方法如下: #include using namespace std; int array[] = {1, -2, 3, 10, -4, 7, 2, -5}; //int array[] = {-...

    PHP实现求连续子数组最大和问题2种解决方法

    在计算机科学和算法设计领域中,寻找连续子数组的最大和是一个非常经典的问题。这个问题的一个著名解法是Kadane算法,它能够以线性时间复杂度O(n)找到这样的子数组。PHP作为一门广泛使用的服务器端脚本语言,提供了...

Global site tag (gtag.js) - Google Analytics