C语言每日一题(18)数组匹配

牛客网 BC156 牛牛的数组匹配

题目描述

描述

牛牛刚学会数组不久,他拿到两个数组 a 和 b,询问 b 的哪一段连续子数组之和与数组 a 之和最接近。

如果有多个子数组之和同样接近,输出起始点最靠左的数组。

输入描述:

第一行输入两个正整数 n 和 m ,表示数组 a 和 b 的长度。

第二第三行输入 n 个和 m 个正整数,表示数组中 a 和 b 的值。

输出描述:

输出子数组之和最接近 a 的子数组

思路分析

基于滑动窗口的思想,从数组最左边开始,将连续子数组之和与numa(a数组里的总和)进行比较。

步骤流程

1.定义所需要输入的数n和m,需要输入的数组a和b,输入a数组时记得求a数组的和(numa)

2.输入完成后,开始进行循环

3.这里需要考虑一个特殊情况,就是当m==1时,就无须进行比较了,直接将b【0】输出即可。

定义left和right分别指向数组最左边的最小连续数组的下标,left=0,right=1,为了之后的方便输出,我们再定义一个cl和cr记录left和right的值。

循环的条件是left<right的同时right<m。

每一次循环:求left和right之间值的和sum,并将sum与numa的差值与min(定义的最小差值,最开始等于numa)进行比较,如果小于min,就将该值赋给min,同时将left的值赋给cl,right的值赋给cr,之后再判断sum的值是否大于numa,大于则left++,小于则right++,(防止连续子数组越来越大)

循环结束后,输出cl和cr之间的值。

完整代码

复制代码
#include <stdio.h>
#include<stdlib.h>
int main() {
    int a[50]={0};
    int b[50]={0};
    int n=0;
    int m=0;
    scanf("%d %d",&n,&m);
    int suma=0;
    for(int i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
        suma+=a[i];

    }
    for(int i=0;i<m;i++)
    {
        scanf("%d",&b[i]);
    }
    int left=0;
    int right=1;
    int cl=0;
    int cr=0;
    int min=suma;//最小差值,最开始=numa
    if(m==1)//m=1的情况直接输出
    {
        printf("%d",b[0]);
        return 0;
    }
    while(left<right&&right<m)
    {
        int sum=0;
        for(int i=left;i<=right;i++)
        {
            sum+=b[i];
        }
        if(abs(sum-suma)<min)//abs函数用来求两者之间差的绝对值
        {
            min=abs(sum-suma);
            cl=left;
            cr=right;
        }
        if(sum>suma)//判断sum与numa的情况
        {
            left++;
        }
        if(sum<suma)
        {
            right++;
        }
    }

    for(int i=cl;i<=cr;i++)//输出
    {
        printf("%d ",b[i]);
    }
    return 0;
}
相关推荐
开开心心就好1 天前
近200个工具的电脑故障修复合集
安全·智能手机·pdf·电脑·consul·memcache·1024程序员节
数据皮皮侠AI3 天前
中国城市可再生能源数据集(2005-2021)|顶刊 Sci Data 11 种能源面板
大数据·人工智能·笔记·能源·1024程序员节
计算机毕业论文辅导6 天前
物联网实战:基于MQTT协议的智能家居数据传输系统设计与实现
1024程序员节
开开心心就好7 天前
支持批量处理的视频分割工具推荐
安全·智能手机·rust·pdf·电脑·1024程序员节·lavarel
liuyao_xianhui9 天前
Linux开发工具结尾 _make
linux·运维·服务器·数据结构·哈希算法·宽度优先·1024程序员节
学传打活11 天前
【边打字.边学昆仑正义文化】_21_爱的结晶(1)
微信公众平台·1024程序员节·汉字·昆仑正义文化
数据皮皮侠AI17 天前
顶刊同款!中国地级市风灾风险与损失数据集(2000-2022)|灾害 / 环境 / 经济研究必备
大数据·人工智能·笔记·能源·1024程序员节
Fab1an19 天前
Busqueda——Hack The Box 靶机
linux·服务器·学习·1024程序员节
技术专家19 天前
Stable Diffusion系列的详细讨论 / Detailed Discussion of the Stable Diffusion Series
人工智能·python·算法·推荐算法·1024程序员节
学传打活22 天前
古代汉语是源,现代汉语是流,源与流一脉相承。
微信公众平台·1024程序员节·汉字·中华文化