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]);
}
}
{
//方法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]);
}
}
相关文章推荐
- 求一个整数数组中和最大的连续子数组,例如:[1, 2, -4, 4, 10, -3, 4, -5, 1]的最大连续子数组是[4, 10, -3, 4](需写明思路,并编程实现)
- 面试题,求一个整数数组中和最大的连续子数组,例如:[1, 2, -4, 4, 10, -3, 4, -5, 1]的最大连续子数组是[4, 10, -3, 4](需写明思路,并编程实现)
- 一个数组中和最大的连续子数组
- 数组连续子数组最大和最大乘积
- 求连续子数组的最大和
- 第四章——最大连续子数组的和
- LeetCode问题53:最大的连续子数组和
- 算法学习-最大连续子数组
- 剑指Offer之连续子数组最大和
- 最大连续子数组
- 剑指offer之连续子数组的最大和(Python)
- 求连续子数组的最大和
- 连续子数组的最大和
- 求数组中和最大的子数组
- 算法学习笔记:最大连续子数组
- 最大连续子数组
- 连续子数组的最大和
- 求解最大连续子数组的算法
- 【Algorithm】最大连续子数组和
- 最大连续子数组积的线性解法