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)是一个经典的问题,旨在从一个...
从头到尾逐个累加示例数组中的每个数字。初始化和为0,第一步加上第一个数字1,...第八步加上最后一个数字-5,由于得到的和为13,小于此前最大和18,因此最终最大的子数组的和为18,对应的子数组是{3,10,-4,7,2}。
在编程领域,数组是最基本的数据结构之一,而寻找数组中最大和的子数组问题是一个经典的算法问题,它属于动态规划的范畴。这个问题的目标是找到数组中的一个连续子数组,使得这个子数组的所有元素之和最大。 首先,...
扫描法是另一种解决连续子数组最大和问题的方法。这种算法与动态规划解法类似,但其初始化方式略有不同。扫描法中,curSum和maxSum都从0开始,对于数组中的每个元素,将其累加到curSum中。如果curSum变为非正,则...
给一个数组,返回它的最大连续子序列的和使用动态规划F(i):以array[i]为末尾元素的子数组的和的最大值,子数组的元素的相对位置不变res:所有子数组的和的
给定一个二维数组,由其中若干邻近元素构成的矩形称为子数组,请编写程序计算所有子数组元素之和的最大值。 【输入数据】第一行是一个整数N,表示二维数组的大小为N*N。接下来的N*N个数被空格和换行符隔开,表示按照...
在编程领域,"求子数组最大和"是一个经典的算法问题,常见于计算机科学的数据结构与算法课程中。这个问题的目标是给定一个整数数组,找出这个数组中的一个连续子数组,使得其元素之和最大。这个问题的一个著名解决...
求子数组的最大和 题目: 输入一个整形数组,数组里有正数也有负数。 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 求所有子数组的和的最大值。要求时间复杂度为O(n)。 例如输入的数组为1, -...
给定一个二维数组,由其中若干邻近元素构成的矩形称为子数组,请编写程序计算所有子数组元素之和的最大值。 【输入数据】第一行为整数N,代表二维数组的大小为N*N。接下来的N*N个整数被空格和换行符隔开,表示按照行...
题目 "乘积最大子数组(动态规划)1" 是一道典型的动态规划问题,来源于 LeetCode 平台。问题要求在给定的整数数组 `nums` 中找出乘积最大的连续子数组,并返回这个子数组的最大乘积。动态规划是一种解决复杂问题的...
求一个数组子数组的最大和,这是一道非常经典的公司面试或笔试题目,我分别使用了暴力枚举、分枝界定、动态规划三种算法实现。
在给定的编程问题中,我们正在探讨一个经典的算法问题,称为“连续最大子数组和”(也称为“最大子序列和”)。这个问题源于计算机科学领域,特别是在算法设计和分析中,经常作为面试和竞赛编程的题目出现。LeetCode...
通过以上讲解,你应该能够理解和实现C语言中数组操作子数组最大平均数的问题。记得在实际编程时,确保对数组的边界条件有充分考虑,并合理运用循环和条件判断来实现算法。祝你在C语言的学习之路上更进一步!
自己写的分治算法,也包括了暴力求解的部分,并比较两者的运行时间,输出最大子数组的起始位置
求一个二维数组中最大连通子数组的和
最大和连续子数组问题(Maximum Subarray Problem)是计算机科学中的一个经典问题,特别是在算法设计和分析领域。这个问题源于寻找一个数组(或序列)中具有最大和的连续子数组。这个子数组不一定是连续的,但其元素...
一个整数数组中的元素有正有负,在该数组中找出一个连续子数组,要求该连续子数组中各元素的和最大,这个连续子数组便被称作最大连续子数组。 随机产生1000以上的数据(有正有负),写入文件input.txt 比如数组{2,4,...
4. **分治法**:对于大型数组,可以使用分治策略,将数组分为两半,递归地找最大值和最小值,然后比较两个子数组的结果。这种方法在数据量大且深度足够的情况下能提高效率。 在实际应用中,为了优化性能,还可以...
动态规划之连续子数组的最大和 连续子数组的最大和是动态规划中的一个经典问题,它们要求我们在给定的数组中找到一个连续的子数组,使得该子数组的和最大。这种问题的解决方法有很多,我们今天将介绍两种不同的方法...