如何求出最大子数组之和

问题描述:一个有n个元素的数组,元素中有正有负,数组中一个或者连续多个元素可以组成一个子数组,求子数组中和最大的?

方法一:暴力法

三层循环,找出所有的子数组,并求出他们对应的和,再取最大值。

代码如下:

package Array;

public class MaxSubArray {     //求最大子数组之和
	public static int maxSubArray(int array[]) {
		int  len  = array.length;
		int ThisSum = 0,MaxSum = 0,i,j,k;
		for(i=0;i<len;i++)
			for(j=i;j<len;j++) {
				ThisSum = 0;
				for(k=i;k<j;k++)
					ThisSum += array[k];
				if(ThisSum>MaxSum)
					MaxSum = ThisSum;
			}
		return MaxSum;
				
	}
	
	public static void main(String[] args) {
		int array[] = {1,-4,7,-5,2,6};
		System.out.println("最大子数和为:"+maxSubArray(array));
	}

}

运行截图:
在这里插入图片描述

方法二:重复利用已计算的的子数组和

例如:Sum[ i , j ] = Sum [ i , j - 1 ] + arr[ j ] ,采用这种方式可以省去计算 Sum [ i , j - 1 ] 的时间。

代码如下:

package Array;

public class MaxSubArray2 {    
	public static int maxSubArray(int array[]) {
		int len = array.length;
		int maxSum = Integer.MIN_VALUE;
		for(int i=0;i<len;i++) {
			int sum = 0;
			for(int j=i;j<len;j++) {
				sum += array[j];
				if(sum>maxSum) {
					maxSum = sum;
				}
			}
		}
		return maxSum;
	}
	
	public static void main(String[] args) {
		int array[] = {1,-4,7,-5,2,6};
		System.out.println("最大子数组之和:"+maxSubArray(array));
	}

}

运行截图:
在这里插入图片描述

方法三:动态规划法

根据数组的最后一个元素arr[ n - 1 ] 与最大子数组的关系分为一下三种:
1.最大子数组包含arr [ n - 1 ],即 arr [ n - 1 ] 结尾。
2.arr [ n - 1 ] 单独构成最大子数组。
3.最大子数组不包含 arr [ n - 1 ] ,那么求 arr [ 1 , … , n - 1 ] 的最大子数组可以转化成为求arr [ 1 , … , n - 2 ]的最大子数组。
假设已经计算出

代码如下:

package Array;

public class MaxSubArray3 {
	public static int max(int m,int n ) {
		return m>n ? m:n;
	}
	public static int maxSubArray(int array[]) {
		int n = array.length;
		int End[] = new int[n];
		int All[] = new int[n];
		End[n-1] = array[n-1];
		All[n-1] = array[n-1];
		End[0] = All[0] = array[0];
		for(int i = 1;i<n;i++) {
			End[i] = max(End[i-1]+array[i],array[i]);
			All[i] = max(End[i],All[i-1]); 
		}
		return All[n-1];
	}
	public static void main(String[] args) {
		int array[] = {1,-4,7,-5,2,6};
		System.out.println("最大子数组和:"+maxSubArray(array));
	}

}

运行截图:
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二维数组的最大数组的和,可以使用动态规划算法。 具体思路是,先将二维数组每一行作为一个一维数组,对每一行进行最大数组和,得到一个一维数组。然后对这个一维数组再次进行最大数组和,得到最终的最大数组和。 以下是使用 Python 实现的代码: ```python def max_subarray_sum(arr): """ 一维数组的最大数组和 """ max_sum = arr[0] cur_sum = arr[0] for i in range(1, len(arr)): cur_sum = max(cur_sum + arr[i], arr[i]) max_sum = max(max_sum, cur_sum) return max_sum def max_submatrix_sum(matrix): """ 二维数组的最大数组和 """ rows = len(matrix) cols = len(matrix[0]) max_sum = float('-inf') for i in range(rows): # 将每一行作为一个一维数组最大数组和 temp = [0] * cols for j in range(i, rows): for k in range(cols): temp[k] += matrix[j][k] # 对一维数组最大数组和 cur_sum = max_subarray_sum(temp) max_sum = max(max_sum, cur_sum) return max_sum ``` 其中,`max_subarray_sum()` 函数用来一维数组的最大数组和,`max_submatrix_sum()` 函数用来二维数组的最大数组和。 我们可以先将每一行作为一个一维数组,对每一行进行最大数组和,得到一个一维数组。然后对这个一维数组再次进行最大数组和,得到最终的最大数组和。 接下来,我们可以使用以下代码测试一下: ```python matrix = [ [1, -2, 3, 0], [-1, 5, -2, 2], [3, 0, 0, -1] ] print(max_submatrix_sum(matrix)) # 输 8 ``` 输结果为 8,符合预期。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值