您的位置:首页 > 其它

求数组的子数组和最大值

2011-12-19 17:06 337 查看
用Java实现的,有兴趣的自己瞅瞅吧..

public class main {

/**
* @param args
*/

public static int MaxSubArraySum(int[] array,int length)
{
if(length == 0)
return 0;
int sum = Integer.MIN_VALUE, cur_sum = array[0];
for(int i = 1; i < length; i++)
{
if(cur_sum < 0)
cur_sum = 0;
cur_sum = cur_sum + array[i];
if(sum < cur_sum)
{
sum = cur_sum;
}
}
return sum;
}
public static int MaxSubArray(int[] array,int length)
{
if(length == 0)
return 0;
int sum = Integer.MIN_VALUE, cur_sum = array[0];
int start = 0, end = 0, tmp = 0;
for(int i = 1; i < length; i++)
{
if(cur_sum < 0)
{
cur_sum = 0;
tmp = i;
}
cur_sum = cur_sum + array[i];
if(sum < cur_sum)
{
sum = cur_sum;
start = tmp;
end = i;
}
}
System.out.println("MaxSubArray:"+start + " "+end);
return sum;
}
public static int Brute_Force_Max_SubArray(int[] array,int length)
{
if(length == 0)
return 0;
int sum = Integer.MIN_VALUE,cur_sum = 0;
int start = 0,end = 0;
for(int i = 0; i < length; i++)
{
cur_sum = 0;
for(int j = i; j < length; j++)
{
cur_sum += array[j];
if(cur_sum > sum)
{
sum = cur_sum;
start = i;
end = j;
}
}
}
System.out.println("Brute_Force_Max_SubArray:"+start + " "+end);
return sum;
}

public static int  Max_SubArray_Ring(int[] array,int length)	//首尾相连
{

int sum_nonering = MaxSubArraySum(array,length);		//先考虑首尾不相连的最大值

int left = 0,leftsum = Integer.MIN_VALUE, leftcur_sum = 0;
for(int i = 0; i < length; i++)
{
leftcur_sum = leftcur_sum + array[i];
if(leftsum < leftcur_sum)
{
leftsum = leftcur_sum;
left = i;
}
}

int right = 0, rightsum = Integer.MIN_VALUE, rightcur_sum = 0;
for(int i = length-1; i >= 0; i--)
{
rightcur_sum = rightcur_sum + array[i];
if(rightsum < rightcur_sum)
{
rightsum = rightcur_sum;
right = i;
}
}

if(left < right)
{
if(sum_nonering < (leftsum+rightsum))
return (leftsum+rightsum);
else
return sum_nonering;
}
else
{
int minStart=0;
int minAll=0;
for(int i=0;i<length;i++)				//计算子数组最小值
{
if(minStart > 0)
minStart = 0;
minStart = array[i] + minStart;
if(minAll > minStart)
minAll = minStart;
}

int ringsum = leftsum+rightsum;
for(int i = right; i <= left; i++)		//删除重复计算的元素,得到数组的全和
ringsum = ringsum - array[i];

int maxsum_ring = ringsum - minAll;

if(sum_nonering < maxsum_ring)
return maxsum_ring;
else
return sum_nonering;
}

}

public static void main(String[] args) {
// TODO Auto-generated method stub
int[] array = {3,-2,3};
System.out.println("result:"+MaxSubArraySum(array,array.length));
System.out.println("result:"+MaxSubArray(array,array.length));
System.out.println("result:"+Brute_Force_Max_SubArray(array,array.length));
System.out.println("result_ring:"+Max_SubArray_Ring(array,array.length));
return;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: