知网AIGC率居高不下?试试这个比话降AI,AI率从100%到14%!
2025/12/22 15:13:34
有两个数组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; }