#include <stdio.h>
/**
*暴力求解最大子数组,使用两重循环,把所有情况全部遍历一遍。
*/
int subArr1(int *arr,int size)
{
int sum = 0, max = arr[0];
int i,j;
for(i = 0;i < size; i++)
{
for(j = i; j < size; j++)
{
sum += arr[j];
if(sum > max)
{
max = sum;
}
}
sum = 0;
}
return max;
}
/**
*求数组中的最大子数组
*/
int subArr2(int *arr,int size)
{
int sum = 0, max = arr[0];
for(int i = 0; i < size; i++)
{
sum += arr[i];
if(sum < arr[i]) // -->在加arr[i]后再判断(sum<arr[i]),
{ // 如果成立,则证明原sum小于0,
sum = arr[i]; // 则舍弃原sum,将arr[i]的值赋给sum
}
if(sum > max) // -->如果sum大于max,则说明arr[i]为有效正数
{ // 将sum的值赋给max
max = sum;
}
}
return max;
}
/**
*求数组中的最大子数组,返回最大子数组的长度
*/
int subArr3(int *arr,int size)
{
int sum = 0;
int max = 0;
int max_start = 0;
int new_start = 0; // new_start是新子数组起点的下标
int max_len = 0; // max_len是最大子数组的长度
int i;
for( i = 0; i < size; i++)
{
sum += arr[i];
if(sum < arr[i])
{
sum = arr[i];
new_start = i; // -->每当子数组重置,将新的子数组下标送给new_start
}
if(sum > max) // -->如果sum大于max,则说明arr[i]为有效正数
{ // 将sum的值赋给max
max = sum;
max_len = i - new_start + 1;
}
}
return max_len;
}
/**
*求数组中的最大子数组,返回最大子数组的初始位置
*/
int subArr4(int *arr,int size)
{
int sum = 0;
int max = arr[0];
int max_start = 0; // max_start是最大子数组的起始坐标
int new_start = 0;
int max_len = 0;
int i;
for( i = 0; i < size; i++)
{
sum += arr[i];
if(sum < arr[i])
{
sum = arr[i];
new_start = i;
}
if(sum > max)
{
max = sum;
max_len = i - new_start + 1;
max_start = new_start; //如果最大值更新,则把新的子数组开始下标赋给max_start
}
}
return max_start;
}
int main(int argc,char *argv[])
{
int a[10] = {-5,2,-8,12,-3,7,-1,4,-10,6};
printf("%d\n",subArr1(a,sizeof(a)/sizeof(a[0])));
printf("%d\n",subArr2(a,sizeof(a)/sizeof(a[0])));
printf("%d\n",subArr3(a,sizeof(a)/sizeof(a[0])));
printf("%d\n",subArr4(a,sizeof(a)/sizeof(a[0])));
return 0;
}
leetcode上还有类似的题,可以尝试着做一下(leetcode第121题)