编程之美--求数组的子数组之和的最大值--扩展问题

问题一,如书中提示的那样,对于情形二就是求数组的子数组之和的最小值,实现代码如下:

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;
}

不对之处请多指正。

点赞