问题一,如书中提示的那样,对于情形二就是求数组的子数组之和的最小值,实现代码如下:
int spanSum(int *arr,int length){
int start=arr[length-1];
int all=arr[length-1];
int sum=all;
for(int i=length-2;i>=0;i--){
sum+=arr[i];
if(start>0)
start=0;
start+=arr[i];
if(start<all)
all=start;
}
return sum-all;
}
int nospanSum(int *arr,int length){
int start=arr[length-1];
int all=arr[length-1];
for(int i=length-2;i>=0;i--){
if(start<0)
start=0;
start+=arr[i];
if(start>all)
all=start;
}
return all;
}
int maxSum(int *arr,int length){
int f=nospanSum(arr,6);
int ff=spanSum(arr,6);
if(f<ff)
f=ff;
return f;
}
对于问题二,对算法做如下修改,时间复杂度不变:
int maxSum(int *arr,int length){
int start=arr[length-1];
int all=arr[length-1];
int flag=length-1;
for(int i=length-2;i>=0;i--){
if(start<0)
start=0;
start+=arr[i];
if(start>all)
all=start,flag=i;
}
printf("location is %d\n",flag);
return all;
}
不对之处请多指正。