给出一个数组,求出最大子数组的和以及始末位置。
直接给出代码解释:
int sub_array(int *array,int n)
{
int max2 = -INF;
int sum = 0;
int cur = 0;
int count2 = 0;
int flag;
int _end;
/*时间复杂度:o(n) 空间复杂度:o(1) */
while(cur < n)
{
/*记录最后一次max改变的位置*/
_end = cur;
sum += array[cur++];
if(sum > max2)
{
max2 = sum;
flag = _end;
}
if(sum < 0)
{
sum = 0;
/*如果当前的和是小于的 就取当前的位置下一个位置作为开始*/
count2 = cur;
}
}
cout << "from " << count2 << "to = " << flag << endl;
return max2;
}
const int INF = 1<<31;
int sub_array(int a[],int len)
{
int MAX = -INF;
int sum = 0;
int cur = 0;
int last = 0;
for(int i=0;i<len;i++)
{
sum += a[i];
if(sum > MAX)
{
MAX = sum;
//记录最后一次改变的位置
last = i;
}
if(sum < 0)
{
sum = 0;
//最后一次改变的时候,当前位置小于0,从下一位置开始
cur = i+1;
}
}
for(int k=cur;k<=last;k++)
{
cout << a[k] << " ";
}
cout << endl;
cout << "from " << cur << "to " << last << endl;
cout << MAX << endl;
return MAX;
}