整数数组匹配

有两个数组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;
}
相关推荐
Brilliantwxx5 分钟前
【算法从零到千】【55-58】哈希位图+常见数学运算 接口
算法
空堂与归1 小时前
用户分群找不到规律?用K-Means聚类算法自动发现数据模式
算法·机器学习·kmeans·聚类
动词ing2 小时前
【C语言】自定义函数+指针入门
c语言·开发语言·算法
重生之后端学习2 小时前
283. 移动零[简单]✅
开发语言·数据结构·算法·leetcode·职场和发展
一只小小的芙厨2 小时前
基础数论总结
笔记·学习·算法
动词ing3 小时前
【C语言】结构体+文件基础
c语言·开发语言·数据结构
夜不会漫长4 小时前
C++入门(1)
开发语言·c++·算法
wen_zhufeng4 小时前
IndexTTS 2.5 技术报告
人工智能·算法·机器学习
大熊背5 小时前
树莓派相机自动白平衡详解(四)
算法·树莓派·白平衡·isppipeline
一米阳光86615 小时前
软考(中级)软件设计师核心笔记(9)算法——背包问题
笔记·算法·职场发展·软考·软件设计师·中级职称