阿里巴巴找黄金宝箱(V)--滑动窗口

news/2024/5/20 8:06:19 标签: 算法, 滑动窗口

【阿里巴巴找黄金宝箱(V)】

一贫如洗的樵夫阿里巴巴在去砍柴的路上,无意中发现了强盗集团的藏宝地,藏宝地有编号从0~N的箱子,每个箱子上面贴有一个数字。
阿里巴巴念出一个咒语数字k(k<N),找出连续k个宝箱数字和的最大值,并输出该最大值。

输入描述

第一行输入一个数字字串,数字之间使用逗号分隔,例如: 2,10,-3,-8,40,5
字串中数字的个数>=1,<=100000;每个数字>=-10000,<=10000;
第二行输入咒语数字,例如:4,咒语数字大小小于宝箱的个数

输出描述

连续k个宝箱数字和的最大值,例如:39

示例1 输入输出示例仅供调试,后台判题数据一般不包含示例

输入

2,10,-3,-8,40,5
4

输出

39

示例2 输入输出示例仅供调试,后台判题数据一般不包含示例

输入

8
1

输出

8

方案1 暴力破解,时间复杂度O(n平方)

方案2 滑动窗体   

方案2:窗口滑动,双指针移动,时间复杂度O(n),对于固定长度k,则起点第i个长度为k的总和:
*  Sum(i) = Sum(i-1) - list[i-1] + list[i+k];

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAX(a, b) ((a) > (b) ? (a) : (b))

//方案1:暴力破解
int BaoLi(int *list, int n, int k)
{
    int sum = 0;
    int max;

    for (int i = 0; i < n - k; i++) {
        sum = 0;
        for (int j = i; j < k + i; j++) {
            sum += list[j];
        }
        if (i == 0) {
            max = sum;
        } else {
            max = MAX(max, sum);
        }
    }

    return max;
}

/*
*方案2:窗口滑动,双指针移动,对于固定长度,则起点第i个长度为k的总和:
*  Sum(i) = Sum(i-1) - list[i-1] + list[i+k];
*/
int DoublePoint(int *list, int n, int k)
{
    int sum = 0;
    int max;
    int left = 0;
    int right = 0;

    while (right < n) {
        sum += list[right];
        right++;
        if (right - left < k) {
            //滑窗大小不满足咒语数字则右边界继续向右滑动
            continue; 
        }
        if (left == 0) {
            max = sum;
        } else {
            max = MAX(max, sum);
        }
        // 滑窗大小已经满足咒语数字,则左边界需要右移
        sum = sum - list[left]; //公式:Sum(i) = Sum(i-1) - list[i-1] + list[i+k];
        left++;
    }
    return max;
}

int main()
{
    int list[100000] = {0};
    char s[100001] = {0};
    int k;

    gets(s);
    scanf("%d", &k);

    char *p = strtok(s, ",");
    int idx = 0;
    while (p != NULL) {
        list[idx] = atoi(p);
        idx++;
        p = strtok(NULL, ",");
    }

    printf("max1=%d\n", BaoLi(list, idx, k));
    printf("max2=%d\n", DoublePoint(list, idx, k));

    return 0;
}


http://www.niftyadmin.cn/n/5011912.html

相关文章

56、springboot ------ RESTful服务及RESTful接口设计

★ RESTful服务 RESTful服务是“前后端分离”架构中的主要功能&#xff1a; 后端应用对外暴露RESTful服务&#xff0c;前端应用则通过RESTful服务与后端应用交互。后端应用 RESTful接口 <------------------> 前端★ 基于JSON的RESTful服务 使用RestController注解…

第12篇:ESP32模拟SPI驱动12864LCD_ST7920显示屏

第1篇:Arduino与ESP32开发板的安装方法 第2篇:ESP32 helloword第一个程序示范点亮板载LED 第3篇:vscode搭建esp32 arduino开发环境 第4篇:vscodeplatformio搭建esp32 arduino开发环境 ​​​​​​第5篇:doit_esp32_devkit_v1使用pmw呼吸灯实验 第6篇:ESP32连接无源喇叭播…

el-dialog弹窗中进度条的(mqtt提供)数据无法清空(清空方法)

清空方法 this.$nextTick(()>{this.$refs.devicefromDialog.clearValidate(airSwitchNo);//清除的校验规则prop传的值this.$refs[devicefromDialog].resetFields();//清除表单内容}) 场景&#xff1a;进度条的数据需要在关闭的时候&#xff0c;清空上一次的缓存记录&#xf…

GE IS220PAICH2A 336A4940CSP11 数字量输入模块产品应用领域

GE IS220PAICH2A 336A4940CSP11 是一款数字量输入模块&#xff0c;通常用于工业自动化和控制系统中&#xff0c;用于监测和采集数字输入信号。这种类型的模块可以在各种应用领域中发挥作用&#xff0c;以下是一些可能的应用领域&#xff1a; 工业过程控制&#xff1a; GE IS220…

计算机视觉CV:1000字总结介绍

目录 1.CV计算机视觉 2.计算机视觉的应用 3.计算机视觉的基本技术 4.计算机视觉的发展趋势 1.CV计算机视觉 计算机视觉&#xff08;Computer Vision, CV&#xff09;是指通过计算机技术模拟人类视觉&#xff0c;让计算机能够“看”懂和理解图像和视频。计算机视觉发展了多…

javaWeb录入数据异常,mysql显示错误

由于项目,需要输入 电脑的mac地址 ,在web页面中进行录入,但是某个同事录入一直有问题,数据查询时使用 in 或者 都查询不到 通过like %% 可以查询到,非常奇怪,请广大网友不吝赐教. 通过 toHex 进行显示发现 数据开头多了 E2808E

CentOS系统环境搭建(十八)——CentOS7安装Docker20.10.12和docker compose v2

centos系统环境搭建专栏&#x1f517;点击跳转 CentOS7安装Docker20.10.12和docker compose v2 关于Docker旧版本和docker compose1.0版本的安装可以看这一篇CentOS系统环境搭建&#xff08;三&#xff09;——Centos7安装Docker&Docker Compose。 1.卸载旧版本 卸载do…

飞书即时消息无需API开发连接Cohere,打造飞书AI智能问答助手

飞书即时消息用户使用场景&#xff1a; 许多企业都在使用飞书系统进行协同办公&#xff0c;而现在有了Cohere大语言模型技术&#xff0c;能够根据用户的提问来自动产生回答&#xff0c;无需人为干预。对于企业负责人来说&#xff0c;他们认为如果将Cohere技术融入到飞书机器人中…