【数据结构和算法】子数组最大平均数 I

其他系列文章导航

Java基础合集
数据结构与算法合集

设计模式合集

多线程合集

分布式合集

ES合集


文章目录

其他系列文章导航

文章目录

前言

一、题目描述

二、题解

2.1 滑动窗口含义

2.2 滑动窗口一般解法

2.3 方法一:滑动窗口

三、代码

3.1 方法一:滑动窗口

四、复杂度分析

4.1 方法一:滑动窗口
 


前言

这是力扣的 643 题,难度简单,解题方案有很多种,本文讲解我认为最奇妙的一种。


一、题目描述

原题链接:力扣 643 题 子数组最大平均数 I

给你一个由 n 个元素组成的整数数组 nums 和一个整数 k 。

请你找出平均数最大且 长度为 k 的连续子数组,并输出该最大平均数。

任何误差小于 10-5 的答案都将被视为正确答案。

示例 1:

输入:nums = [1,12,-5,-6,50,3], k = 4
输出:12.75
解释:最大平均数 (12-5-6+50)/4 = 51/4 = 12.75

示例 2:

输入:nums = [5], k = 1
输出:5.00000

提示:

  • n == nums.length
  • 1 <= k <= n <= 105
  • -104 <= nums[i] <= 104

二、题解

这道题目不难,但是确实是一道非常经典的滑动窗口问题,它可以帮助我们很好地理解滑动窗口算法的本质和应用。

2.1 滑动窗口含义

滑动窗口算法是一种在数组或列表中寻找特定元素的强大工具,可以高效地解决一系列问题。

例如找到一个数组中最大的K个元素、在一个数组中查找子数组的数量等等。

滑动窗口算法的核心思想是在数组或列表中保持一个连续的、大小固定的窗口,并在遍历过程中动态地调整窗口的位置。

2.2 滑动窗口一般解法

滑动窗口算法是一种常见的算法技巧,用于解决一些数组或字符串相关的问题。下面将详细介绍滑动窗口算法的工作原理和应用场景:

工作原理:

  1. 窗口大小:滑动窗口算法通过设定一个窗口的大小来解决问题。窗口通常是一个连续的子数组或子字符串。
  2. 初始化窗口:初始化窗口的起始位置,并根据问题需求设定窗口的大小。
  3. 移动窗口:通过移动窗口的起始位置,不断调整窗口的大小和位置,以找到满足问题条件的解。
  4. 更新解:根据窗口的移动和调整,更新问题的解,并记录或返回所需的结果。

应用场景:

  1. 最小/最大子数组/子字符串:寻找给定数组或字符串中满足特定条件的最小或最大的子数组或子字符串。
  2. 字符串匹配:在一个字符串中寻找另一个字符串的出现或满足特定条件的子串。
  3. 滑动窗口和哈希表结合:通过使用哈希表来优化滑动窗口算法,提高效率。
  4. 优化窗口大小:根据问题的特性,调整窗口大小以寻找最佳解。

滑动窗口算法的步骤通常如下:

  1. 初始化窗口的起始位置和结束位置,使其满足问题的要求。
  2. 进入循环,不断移动窗口的起始位置和结束位置,直到窗口滑动到数组或字符串的末尾。
  3. 在每一次循环中,检查窗口内的元素是否满足问题的要求。如果满足条件,则更新解或执行其他操作。如果不满足条件,则继续移动窗口。
  4. 在移动窗口时,要更新窗口内的元素和相应的数据结构,以确保窗口的正确性。
  5. 重复步骤2到步骤4,直到遍历完整个数组或字符串,返回解或所需的结果。

需要注意的是,滑动窗口算法的时间复杂度取决于窗口的大小和问题的特性。在某些情况下,可能需要通过调整窗口大小来优化算法的性能。

2.3 方法一:滑动窗口

思路与算法:

滑动窗口顾名思义先要有窗口。

首先定义两个变量 sum 和 maxSum ,sum 存每次 k 个元素和, maxSum 存最大的 sum 。

那我们就在数组最前方取 k 个元素当作窗口,计算出 sum 。

然后更新 maxSum 。

窗口如何滑动? 去掉最前面的元素,加上后一个元素,实现滑动。

 时刻更新 maxSum ,最后返回 (double) maxSum/k 。


三、代码

3.1 方法一:滑动窗口

Java版本:

class Solution {
    public double findMaxAverage(int[] nums, int k) {
       int sum = 0, maxSum;
        for (int i = 0; i < k; i++) {
            sum += nums[i];
        }
        maxSum = sum;
        for (int i = k; i < nums.length; i++) {
            sum = sum - nums[i - k] + nums[i];
            maxSum=Math.max(maxSum,sum);
        }
        return (double) maxSum/k;
    }
}

C++版本:

class Solution {
public:
    double findMaxAverage(vector<int>& nums, int k) {
        int sum = 0, maxSum;
        for (int i = 0; i < k; i++) {
            sum += nums[i];
        }
        maxSum = sum;
        for (int i = k; i < nums.size(); i++) {
            sum = sum - nums[i - k] + nums[i];
            maxSum = max(maxSum, sum);
        }
        return static_cast<double>(maxSum) / k;
    }
};

Python版本:

class Solution:
    def findMaxAverage(self, nums: List[int], k: int) -> float:
        _sum = sum(nums[:k])
        max_sum = _sum
        for i in range(k, len(nums)):
            _sum = _sum - nums[i - k] + nums[i]
            max_sum = max(max_sum, _sum)
        return max_sum / k

四、复杂度分析

4.1 方法一:滑动窗口

  • 时间复杂度:O(n),其中 n 是数组 nums 的长度。遍历数组一次。
  • 空间复杂度:O(1)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/260493.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据挖掘体系介绍

数据挖掘是什么&#xff1f; 简而言之&#xff0c;对数据进行挖掘&#xff0c;从中提取出有效的信息。一般我们会把这种信息通过概念、规则、规律、模式等有组织的方式展示出来&#xff0c;形成所谓的知识。特别是在这个大数据时代&#xff0c;当数据多到一定程度&#xff0c;…

Jenkins 执行远程脚本的插件—SSH2 Easy

SSH2 Easy 是什么&#xff1f; SSH2 Easy 是一个 Jenkins 插件&#xff0c;它用于在 Jenkins 构建过程中通过 SSH2 协议与远程服务器进行交互。通过该插件&#xff0c;用户可以在 Jenkins 的构建过程中执行远程命令、上传或下载文件、管理远程服务器等操作。 以下是 SSH2 Eas…

用户管理第2节课--idea 2023.2 后端--实现基本数据库操作(操作user表)

一、模型user对象>和数据库的字段关联 & 自动生成 【其中涉及删除表数据&#xff0c;一切又从零开始】 二、模型user对象>和数据库的字段关联 2.1在model文件夹下&#xff0c;新建 user对象 2.1.1 概念 大家可以想象我们现在的数据是存储在数据库里的&…

HOT 100 最难的题居然是游戏厂的最爱

写在前面 翻看 网易 历年笔面题单的时候&#xff0c;发现一道有意思的题目。 该题评论区&#xff0c;网易 的踪影很少&#xff0c;反而被那些在 4399 笔试中遇到的同学所攻陷&#xff1a; 好嘛&#xff0c;所以这道题还是「游戏厂」的最爱&#xff1f;&#xff01;&#x1f923…

Ubuntu 常用命令之 fdisk 命令用法介绍

fdisk 是一个用于处理磁盘分区的命令行工具,它在 Linux 系统中广泛使用。fdisk 命令可以创建、删除、更改、复制和显示硬盘分区,以及更改硬盘的分区 ID。 fdisk 命令的常用参数如下 -l:列出所有分区表-b:设置扇区大小,如果不设置,默认为 512 字节-u:改变显示/输入单位-…

亚马逊鲲鹏系统引爆广告点击率提升秘籍

在竞争激烈的电商市场&#xff0c;提高广告点击率成为各大卖家争相追求的目标。而如今&#xff0c;亚马逊鲲鹏系统的强大功能再次为卖家们打开了广告优化的新大门。其中&#xff0c;搜索广告功能更是成为提高关键词排名的利器。本文将详细介绍如何通过亚马逊鲲鹏系统实现点击广…

全球知名的五款JavaScript混淆加密工具详解

​ 现在市场上有很多好用的混淆加密工具&#xff0c;其中一些比较流行且受欢迎的工具包括&#xff1a; 1、UglifyJS&#xff08;罗马尼亚&#xff09;&#xff1a;UglifyJS是一个非常流行的 JavaScript工具库&#xff0c;它可以压缩、混淆、美化和格式化 JavaScript 代码。使用…

A01、关于jvm执行子系统

1、Class 类文件结构 1.1、Java跨平台的基础 各种不同平台的虚拟机与所有平台都统一使用的程序存储格式——字节码&#xff08;ByteCode&#xff09;是构成平台无关性的基石&#xff0c;也是语言无关性的基础。Java虚拟机不和包括Java在内的任何语言绑定&#xff0c;它只与 “…

新三板炒股开户需要满足哪些条件?交易规则有哪些?

新三板是全国中小企业股份转让系统&#xff0c;属于场外市场&#xff0c;不能满足在主板上市的中小企业就可以申请在新三板挂牌交易。 一、新三板开通条件 新三板分为2个层级&#xff1a; 创新层&#xff1a;开通前10个交易日日均资产100万及以上&#xff0c;两年的股票交易经…

Jenkins 构建触发器指南

目录 触发远程构建 (例如&#xff0c;使用脚本) 描述 配置步骤 安全令牌 在其他项目构建完成后触发构建 描述 配置步骤 定时触发构建 描述 配置步骤 GitHub钩子触发GITScm轮询 描述 配置步骤 Poll SCM - 轮询版本控制系统 描述 触发远程构建 (例如&#xff0c;使…

基于SSM的双减后初小教育课外学习生活活动平台的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

基于EasyDarwin、ffmpeg实现rtsp推流

目录 1 安装EasyDarwin 2 编译安装ffmpeg 3 启动EasyDarwin 4 ffmepg推流 5 百度网盘备份 某项目中测试时需要用到推流&#xff0c;于是用EasyDarwin、ffmpeg实现了RTSP推流&#xff0c;简单记录下过程&#xff0c; 1 安装EasyDarwin 这个可以去官网下载&#xff1a;Eas…

SearchWP WordPress高级网站内容搜索插件

点击阅读SearchWP WordPress高级网站内容搜索插件原文 SearchWP WordPress高级网站内容搜索插件是一个非常强大的工具&#xff0c;可以显着增强您网站的搜索功能。通过向网站访问者提供高度相关和精确的搜索结果&#xff0c;它可以有效地简化他们的搜索过程&#xff0c;促进发…

快速能访问服务器的文件

1、背景 访问ubuntu上的文件 2、方法 python3 -m http.server 8081 --directory /home/ NAS 共享访问协议 — NFS、SMB、FTP、WebDAV 各有何优势&#xff1f;http://1 Ubuntu 搭建文件服务器&#xff08;Nginx&#xff09;

SCA面面观 | SCA关键技术深度解析

数字时代的软件开发普遍遵循敏捷实践&#xff0c;发布和部署周期都很短&#xff0c;开发团队非常依赖开源来加速创新迭代速度。因此&#xff0c;对团队项目中包含的每个开源组件进行跟踪非常重要&#xff0c;可以避免法律风险&#xff0c;保持强大的安全态势。 在DevSecOps环境…

[c]用指针进行四个数排序

#include<stdio.h> void swap(int*p1,int*p2)//定义函数&#xff0c;实现两个数值交换 {int temp;temp*p1;*p1*p2;*p2temp; } void psort( int *pa, int *pb,int *pc,int *pd) {int i1;for(i1;i<3;i)//对四个数排序&#xff0c;至少3次循环&#xff0c;交换过后是升序…

Observability:客户为什么选择 Elastic 做日志?

作者&#xff1a;Ty Bekiares Elastic 正在改变日志体验以满足现代工作流程的需求。 在没有其他可观察信号的情况下&#xff0c;通常基础设施中的所有内容&#xff08;硬件、软件和服务&#xff09;都会发出日志行。 然而&#xff0c;日志通常是根据开发人员的想法构建的&…

大模型互相“薅羊毛”背后,行业基本操作,规范化势在必行

最近&#xff0c;字节跳动被曝调用 OpenAI API 接口训练大模型的争议&#xff0c;以及谷歌大模型 Gemini 被曝使用百度文心一言进行中文语料训练等事件&#xff0c;在行业里引发了不小的关注和讨论。 不明真相的网友们一边热情吃瓜&#xff0c;一边也在感叹 AI 大厂之间互相“…

简单易懂!Pytorch安装教程(超详细)

在正式开始学习Pytorch之前&#xff0c;安装Pytorch同样是重要的一个环节。我将安装Pytorch的主要过程以及遇到的一些问题写在下面&#xff0c;希望能对各位有所帮助。 一、系统与环境说明 在开始用Pytorch进行深度学习之前&#xff0c;要先准备好基本的软硬件环境。下面我分…

深入理解网络 I/O:FileOutputStream、BufferFileOutputStream、ByteBuffer

&#x1f52d; 嗨&#xff0c;您好 &#x1f44b; 我是 vnjohn&#xff0c;在互联网企业担任 Java 开发&#xff0c;CSDN 优质创作者 &#x1f4d6; 推荐专栏&#xff1a;Spring、MySQL、Nacos、Java&#xff0c;后续其他专栏会持续优化更新迭代 &#x1f332;文章所在专栏&…