有两个数组a和b数组,都是正数的数组,a的数组总和在b数组中哪一块连续的空间差值最小,如果找到了,就打印b数组中的数组元素,首先解决这个问题需要有两个数组,还需要把a数组的总和求出来,求出来以后对比b数组,一个一个对比,两层循环,分别从0开始匹配,left不动,让right从1到最后以次累加起来和a数组总和进行对比,如果right所记录的值比求得的差值要小,就让min被重新赋值,然后记录当前的left和right,一直循环下去直到遍历完整个数组,打印templeft和tempright中间的值,这种方法是暴力求解,时间复杂最坏的情况下是O(n^2)
#include <stdio.h>
int main() {
//输入
int n=0;
int m=0;
scanf("%d %d",&n,&m);//两个值
int a[n];
int b[m];
int i=0;
int sum=0;
for(i=0;i<n;i++)//n是a
{
scanf("%d",&a[i]);
sum+=a[i];//求得总和
}
for(i=0;i<m;i++)
{
scanf("%d",&b[i]);
}
//得到了a数组的总大小
int min=INT_MAX;//把初始的min赋值为一个最大值
int left;//左边的下标
int right;//右边的下标
i=0;//i重新赋值为0,从下标为零开始循环
int tempsum=0;//记录每次right+1的值
int tempright=0;//记录需要被打印的右边下标
int templeft=0;//记录需要被打印的左边的下标
while(i<m)//m代表b
{
left=i;//开始都是从0开始累加
right=i;
tempsum=0;//每次结束一次循环tempsum都要初始化为0
while(right<m)//right以次累加
{
tempsum+=b[right];//累加
int tempmin=sum>tempsum?sum-tempsum:tempsum-sum;//计算差值,保证差值是正值
if(tempmin<min)//如果临时的差值比定义的差值小,就把right left tempmin赋值
{
min=tempmin;
tempright=right;
templeft=left;
}
if(tempsum>=sum)//如果tmepsum都已经大于sum而且b数组都是正数,越加只会越大
{
break;
}
right++;//向后累加
}
i++;//遍历数组
}
for(i=templeft;i<=tempright;i++)
{
printf("%d ",b[i]);
}
return 0;
}