`
easyhaohao
  • 浏览: 13692 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

子数组的最大和

J# 
阅读更多

public class SubarrayMax {
	
	
	public static void main(String[] args)
	{
		int[] a = {8,-1,-1,5,3,2,8,-9};
		
		System.out.println(method1(a,a.length));
		System.out.println(method2(a,a.length));
		System.out.println(method3(a,a.length));
		
		System.out.println(method4(a,0,a.length-1));
	}
	
	
	//分治思想
	public static int method4(int a[],int left,int right){  
	    if(left==right){  
	        return max(a[left],0);  
	    }  
	    int middle=(left+right)/2;  
	    //求(A[0],...A[n/2-1])中子数组包含A[n/2-1]的最大值  
	    int lmaximum=0;  
	    int lsum=0;  
	    for(int i=middle;i>=left;i--){  
	        lsum+=a[i];  
	        if(lsum>lmaximum)  
	            lmaximum=lsum;  
	    }  
	    //求(A[n/2],...,A[n-1])中子数组包含A[n/2]的最大值  
	    int rmaximum=0;  
	    int rsum=0;  
	    for(int i=middle+1;i<=right;i++){  
	        rsum+=a[i];  
	        if(rsum>rmaximum)  
	            rmaximum=rsum;  
	    }  
	    return max(lmaximum+rmaximum,max(method4(a,left,middle),method4(a,middle+1,right)));  
	} 
	
	
	public static int method3(int[] a,int n)
	{
		int nstart = a[n-1];
		int nall = a[n-1];
		
		
		for(int i=n-2;i>=0;i--)
		{
			
			if(nstart<0)
				nstart = 0;
			nstart +=a[i];
			
			if(nstart>nall)
				nall = nstart;
		}
		
		return nall;
	}
	
	//start 包含a[i]的最大值
	//all 最大值
	public static int method1(int a[],int n)
	{
		
		int[] start = new int[n];
		int[] all = new int[n];
		
		start[n-1] = a[n-1];
		all[n-1] = a[n-1];
		
		for(int i=n-2;i>=0;i--)
		{
			start[i] = max(a[i],a[i]+start[i+1]);
			all[i] = max(start[i],all[i+1]);
		}
		
		return all[0];
		
	}
	
	
	//节省空间
	public static int method2(int[] a,int n)
	{
		int nstart = a[n-1];
		int nall = a[n-1];
		
		for(int i=n-2;i>=0;i--)
		{
			nstart = max(a[i],nstart+a[i]);
			nall = max(nstart,nall);
		}
		
		return nall;
	}

	
	
	
	

	private static int max(int i, int j) {
		return i>j?i:j;
	}
}


分享到:
评论

相关推荐

    子数组最大和 Maximal Contiguous Subsequent Sum Problem

    ### 子数组最大和问题(Maximal Contiguous Subsequent Sum Problem) #### 一、问题定义与背景 在计算机科学领域,子数组最大和问题(Maximal Contiguous Subsequent Sum Problem)是一个经典的问题,旨在从一个...

    连续子数组的最大和

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

    数组中最大和的子数组

    在编程领域,数组是最基本的数据结构之一,而寻找数组中最大和的子数组问题是一个经典的算法问题,它属于动态规划的范畴。这个问题的目标是找到数组中的一个连续子数组,使得这个子数组的所有元素之和最大。 首先,...

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

    扫描法是另一种解决连续子数组最大和问题的方法。这种算法与动态规划解法类似,但其初始化方式略有不同。扫描法中,curSum和maxSum都从0开始,对于数组中的每个元素,将其累加到curSum中。如果curSum变为非正,则...

    dahuzi998#2018-Java-Interview#算法-动态规划-连续子数组最大和1

    给一个数组,返回它的最大连续子序列的和使用动态规划F(i):以array[i]为末尾元素的子数组的和的最大值,子数组的元素的相对位置不变res:所有子数组的和的

    求二维数组最大和的子数组

    给定一个二维数组,由其中若干邻近元素构成的矩形称为子数组,请编写程序计算所有子数组元素之和的最大值。 【输入数据】第一行是一个整数N,表示二维数组的大小为N*N。接下来的N*N个数被空格和换行符隔开,表示按照...

    求子数组最大和

    在编程领域,"求子数组最大和"是一个经典的算法问题,常见于计算机科学的数据结构与算法课程中。这个问题的目标是给定一个整数数组,找出这个数组中的一个连续子数组,使得其元素之和最大。这个问题的一个著名解决...

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

    求子数组的最大和 题目: 输入一个整形数组,数组里有正数也有负数。 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 求所有子数组的和的最大值。要求时间复杂度为O(n)。 例如输入的数组为1, -...

    求二维数组的最大和的子数组

    给定一个二维数组,由其中若干邻近元素构成的矩形称为子数组,请编写程序计算所有子数组元素之和的最大值。 【输入数据】第一行为整数N,代表二维数组的大小为N*N。接下来的N*N个整数被空格和换行符隔开,表示按照行...

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

    题目 "乘积最大子数组(动态规划)1" 是一道典型的动态规划问题,来源于 LeetCode 平台。问题要求在给定的整数数组 `nums` 中找出乘积最大的连续子数组,并返回这个子数组的最大乘积。动态规划是一种解决复杂问题的...

    一个数组子数组的最大和

    求一个数组子数组的最大和,这是一道非常经典的公司面试或笔试题目,我分别使用了暴力枚举、分枝界定、动态规划三种算法实现。

    连续最大子数组和1

    在给定的编程问题中,我们正在探讨一个经典的算法问题,称为“连续最大子数组和”(也称为“最大子序列和”)。这个问题源于计算机科学领域,特别是在算法设计和分析中,经常作为面试和竞赛编程的题目出现。LeetCode...

    c语言入门编程之数组操作子数组最大平均数.zip

    通过以上讲解,你应该能够理解和实现C语言中数组操作子数组最大平均数的问题。记得在实际编程时,确保对数组的边界条件有充分考虑,并合理运用循环和条件判断来实现算法。祝你在C语言的学习之路上更进一步!

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

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

    求二维数组中的最大连通子数组的和

    求一个二维数组中最大连通子数组的和

    最大和连续子数组1

    最大和连续子数组问题(Maximum Subarray Problem)是计算机科学中的一个经典问题,特别是在算法设计和分析领域。这个问题源于寻找一个数组(或序列)中具有最大和的连续子数组。这个子数组不一定是连续的,但其元素...

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

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

    数组最大值最小值_数组最大值最小值_最小值_

    4. **分治法**:对于大型数组,可以使用分治策略,将数组分为两半,递归地找最大值和最小值,然后比较两个子数组的结果。这种方法在数据量大且深度足够的情况下能提高效率。 在实际应用中,为了优化性能,还可以...

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

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

Global site tag (gtag.js) - Google Analytics