/**
* 方法1(蛮力法):两次循环求最大子数组之和
*/
public static int maxSubArray1(int[] a){
int i,j;
int ThisSum=0;
int MaxSum=0;
for (i = 0; i < a.length; i++) {
ThisSum=a[i];
for(j=i+1;j<a.length;j++){
ThisSum+=a[j];
if(ThisSum>MaxSum){
MaxSum=ThisSum;
}
}
}
return MaxSum;
}
/**
* 方法2:优化的动态规划方法
* nEnd就是通过“数组依次相加加到a[i],然后与a[i]做比较”得来的,保存较大的。因为如果前面的数加到a[i]
* 还没有a[i]本身大,那么前面的数也就对最大子数组和没有贡献。厉害
* nAll就是记录一下之前的新得到的nEnd和自身之前谁更大
*/
public static int max(int m,int n){
return m>n?m:n;
}
public static int maxSubArray2(int[] a){
int nAll=a[0];//有n个数字数组的最大子数组之和
int nEnd=a[0];//有n个数字数组包含最后一个元素的子数组的最大和
for (int i = 1; i < a.length; i++) {
nEnd=max(nEnd+a[i],a[i]);
nAll=max(nEnd, nAll);
}
return nAll;
}
private static int begin=0;
private static int end=0;
/**
* 求出最大子数组的开始begin,结尾end,以及整个子数组
*/
public static int maxSubArray3(int[] a){
int maxSum=Integer.MIN_VALUE;
int nSum=0;
int nStart=0;
for (int i = 0; i < a.length; i++) {
if(nSum<0){
nSum=a[i];
nStart=i;
}
else{
nSum+=a[i];
}
if(nSum>maxSum){
maxSum=nSum;
begin=nStart;
end=i;
}
}
return maxSum;
}
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有