您的位置:首页 > 编程语言 > C#

C#求数组中和最大的连续子数组

2012-04-05 19:35 357 查看
class Program

{

//方法1

public static Dictionary<string, int> maxSubArry(int[] a)

{

Dictionary<string, int> di = new Dictionary<string, int>();

//int[] di = new int[3];

if (a.Length <= 0)

{

Console.WriteLine("数组为空");

}

int MaxStart = 0,MaxEnd=0, curr = 0; //当前位置和最大子数组的及起始和终止位置,当前位置

int SumStart = 0, SumEnd = 0; //当前位置子数组的起始和终止位置

int sum=0; //当前位置的和

int max = 0; //当前位置最大的和

while (curr < a.Length)

{

sum += a[curr];

if(sum>max)

{

max = sum;

MaxEnd = curr;

MaxStart = SumStart;

}

else if(sum>0&&sum<max)

{

SumEnd = curr;

}

else if (sum < 0)

{

sum = 0;

SumStart = curr+1;

SumEnd = curr+1;

}

curr++;

}

di.Add("Max",max);

di.Add("Start",MaxStart);

di.Add("End",MaxEnd);

return di;

}

//方法2

public static int[] maxSubArryInt(int[] a)

{

int[] di = new int[3];

if (a.Length <= 0)

{

Console.WriteLine("数组为空");

}

int MaxStart = 0, MaxEnd = 0, curr = 0;

int SumStart = 0, SumEnd = 0;

int sum = 0;

int max = 0;

while (curr < a.Length)

{

sum += a[curr];

if (sum > max)

{

max = sum;

MaxEnd = curr;

MaxStart = SumStart;

}

else if (sum > 0 && sum < max)

{

SumEnd = curr;

}

else if (sum < 0)

{

sum = 0;

SumStart = curr + 1;

SumEnd = curr + 1;

}

curr++;

}

di[0] = max;

di[1] = MaxStart;

di[2] = MaxEnd;

return di;

}

static void Main(string[] args)

{

int[] a = { 31, -41, -4, 26, -53, 58, 97, -63, -23, 84 };

int[] a2 = { 51, -41, -9, 26, 53, -58, 97, 93, -23, -12,-84 };

int[] a3 = { 51, -41, -91};

int[] a1 = new int[] {31, -41, 59, 26, -53, 58, 97, -93, -23, 84 };

//int start,end;

Dictionary<string,int> sum = maxSubArry(a);

int[] sum2 = maxSubArryInt(a);

int max = sum["Max"];

Console.WriteLine("(1)子数组的最大和:{0},下标从[{1}]到[{2}]",max,sum["Start"],sum["End"]);

Console.WriteLine("(2)子数组的最大和:{0},下标从[{1}]到[{2}]", sum2[0], sum2[1], sum2[2]);

}

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