数组最长子段和java实现

来源:互联网 发布:添加sql语句 编辑:程序博客网 时间:2024/04/30 13:19
package Test;


//计算数组的最大子段和
public class lcs {
public static void main(String[] args)
{
int num[]={1,-2,3,10,-4,7,2,-5};
//int max=lcs_first(num);
//int max=lcs_fenzhi(num, 0, num.length-1);
int max=getMaxSeq(num);
System.out.print("最大子段和为:"+max);

}
public static int lcs_first(int[] num) {
// 编程之美上的做法,如果子段和为负数,则抛弃现在再算的子段和,以下一元素为头重新开始计算子段和
int sum = num[0];
int max = num[0];
for (int i = 1; i < num.length - 1; i++) {
if (sum < 0)
sum = 0;
sum += num[i];
if (sum > max)
max = sum;
}
return max;
}
//分治法,最大字段和可能在数组的左边连续部分,右边部分的连续和,以及中间部分的连续和
public static int lcs_fenzhi(int[] num,int start,int end)
{
if(start==end)
return num[start];
if(end<start){
return 0;
}
int middle=(start+end)/2;
int left=lcs_fenzhi(num, start, middle);//求出左边部分的最大值
int right=lcs_fenzhi(num, middle+1, end);//求出右边部分最大值
int sum=num[middle];
int max=num[middle];
int i=middle-1;
int j=middle+1;
while (i>=start) {
sum+=num[i];
if(sum>max)
max=sum;
--i;
}
sum=max;
while (j<=end) {
sum+=num[j];
if(sum>max)
max=sum;
 ++j;
}
int maxsun=left>right?left:right;
maxsun=max>maxsun?max:maxsun;
return maxsun;

}
//和第一种方法思路是一样的
public static int getMaxSeq(int[] a){ //最大连续队列  
int[] sum = new int[a.length];  
sum[0]=a[0];  int max = a[0];  
for(int i=1;i<a.length;i++){     
sum[i]=(sum[i-1]+a[i]>a[i])?sum[i-1]+a[i]:a[i]; //判断前一项是否为负值,存放最大值      
max = max>sum[i]?max:sum[i];   //max记录最大值 

return max;  }


}
0 0
原创粉丝点击