【算法技巧】数组连续子集操作---滑动窗口使用

2023-05-16

题目

已知一个数组arr=[-5,2,7,4,3,6],求长度为k的连续连续子集和中最大值

解题思路

想法1

首先是比较容易想到的思路,即利用双层循环进行遍历,代码如下:

int maxSum(vector<int> &arr,int k){
	//首先进行判断,如果数组长度不足k,直接返回0
	int n = arr.size();
	if(n < k) return 0;
	//定义全局变量记录最大值,两重循环遍历完整个数组
	int ans = INT_MIN;
	for(int i = 0;i <= n - k;i++){
		int sum = 0;
		for(int j = 0;j < k;j++){
			sum += arr[i + j];
		}
		ans = max(ans,sum);
	}
	return ans;
}

虽然这种思路容易被想到,但是时间复杂度过高,是O(n2),所以介绍今天的重点,滑动窗口求连续长度子数组和最大值

想法2

既然要求长度为k的子数组元素之和,那么可以看出,求arr[0]到arr[k]的元素之和与求arr[1]到arr[k+1],中间有重复的arr[1]至arr[k],所以这个思路就是利用中间不变性,只需要考虑收尾元素即可,代码如下:

int maxSum(vector<int> &arr,int k){
	//首先进行判断,如果数组长度不足k,直接返回0
	int n = arr.size();
	if(n < k) return 0;
	//定义全局变量记录最大值,两重循环遍历完整个数组
	int ans = INT_MIN;
	// 区别只在循环这里,首先求得从下标0开始长度为K的子数组长度
	int sum = 0;
	for(int i = 0;i <k;i++){
		sum += arr[i];
	}
	ans = max(ans,sum);
	// 后面需要做的就是去掉头,加上尾,中间保持不动即可
	for(int i = k;i < n;i++){
		sum = sum - arr[i - k] + arr[i];
		ans = max(ans,sum);
	}
	return ans;
} 

通过利用局部不变性,可将时间复杂度降为O(n)

拓展

利用滑动窗口,还可以求连续子集的如下操作

  • 连续子集元素均值
  • 连续子集元素和/均值大于某个阈值的情况等

总而言之,涉及到数组元素是数字且求连续子集的相关操作时,都可以考虑使用滑动窗口

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【算法技巧】数组连续子集操作---滑动窗口使用 的相关文章

随机推荐

  • 解决远程桌面总是自动断开

    Win 43 R 打开运行窗口输入 sysdm cpl xff0c 确定点击 允许远程连接到此计算机 xff0c 确定重新进行 本地远程连接
  • IOS15 的UITableViewController 如何初始化

    IOS15 的UITableViewController 如何初始化 一个类继承了UITableViewController xff0c 如何初始化UITableView的样式 xff0c 一般有group组样式 xff0c 也有plain
  • WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix t

    WARNING overcommit memory is set to 0 Background save may fail under low memory condition To fix this issue add 39 vm ov
  • 码云的初次使用

    文章目录 下载Git码云官网注册初始化第一次上传代码到git 通过这篇博客成功使用了码云 xff1a https blog csdn net ai1362425349 article details 82119889 现在整理一下 xff0
  • Superset数据探索和可视化平台入门以及案例实操

    1 Superset背景 1 1 Superset概述 Apache Superset是一个现代的数据探索和可视化平台 它功能强大且十分易用 xff0c 可对接各种数据源 xff0c 包括很多现代的大数据分析引擎 xff0c 拥有丰富的图表
  • C语言中信号量的使用

    在操作系统理论课上 xff0c 其实讲授了信号量的原理和使用方式以及使用信号量的优点 相信看到这篇文章的人已经对信号量底层实现机制有了一定的了解 xff0c 这里就不再过多赘述 本文主要以两个题目为例来讲授信号量如何在高级语言中使用 如果不
  • C语言使用信号量(Linux)

    在windows中使用信号量已经在另一篇文章中讲过了 xff0c 信号量的详细细节也已经展示了 xff0c 本文介绍如何在linux环境下使用c语言编写信号量类型的例子代码 windows c语言使用信号量 与windows环境下不同 xf
  • iOS Dev (10) 创建一个简单的 UIView

    iOS Dev 10 创建一个简单的 UIView 作者 xff1a CSDN 大锐哥地址 xff1a http blog csdn net prevention 创建一个 Empty App 略 创建一个 UIView BOOL appl
  • Ubuntu双系统的安装

    文章目录 制作系统盘磁盘分区安装系统换源解决系统同步问题更改启动默认项双系统的卸载 制作系统盘 下载Win32DiskImager xff0c Ubuntu操作系统映像 xff0c 准备好U盘 写入完成后 xff0c 打开U盘能看见efi文
  • 关于XSS三种攻击方式的理解:反射性,存储型,基于DOM

    关于XSS三种攻击方式的理解 xff1a 反射性 xff0c 存储型 xff0c 基于DOM 首先脚本执行需要客户端浏览器进行解析 xff0c 是js脚本就交个js环境解析 xff0c 或者php交给php环境解析 xff0c 只有在相应环
  • 汉字编码基础知识(一)

    lt script src 61 34 win js 34 type 61 34 text javascript 34 gt lt script gt 4 1 基础知识 4 1 1 GB2312 范围 xff1a 0xA1A1 0xFEFE
  • 如何在群晖NAS中搭建WebDav服务,并外网可访问

    目录 1 在群晖套件中心安装WebDav Server套件 1 1 安装完成后 xff0c 启动webdav服务 xff0c 并勾选HTTP复选框 2 局域网测试WebDav服务 2 1 下载RaiDrive客户端 2 2 打开RaiDri
  • 【SSH】-pycharm远程连接Linux服务器

    用实验室的机器跑程序 xff1a 两个比较好的博客 xff0c 可以参考完成搭建 链接1 link 链接2 link
  • golang 编译无窗口模式

    go build ldflags 34 H windowsgui 34 main go main go是你要编译的文件
  • Ubuntu软件安装卸载涉及包依赖的问题

    新手使用Ubuntu xff0c 期间装了各种方便系统使用的工具软件 xff0c 其中有些因为版本的问题没有装成功 xff0c 再安装或卸载其他软件时就会出莫名其妙的问题 xff0c 如我在卸载syspeek时 xff0c 遇到如下报错 x
  • Qt 5基础 | Qt Creator 5.6.1-1的下载与安装

    Qt 5基础 Qt Creator 5 6 1 1的下载与安装 Qt 5基础 Qt Creator 5 6 1 1的下载与安装下载安装 官方博客 xff1a https www yafeilinux com Qt开源社区 xff1a htt
  • 【原创】开源OpenIM:轻量、高效、实时、可靠、低成本的消息模型

    原创 开源OpenIM xff1a 轻量 高效 实时 可靠 低成本的消息模型 1 内容概述 一套完整IM系统中 xff0c 除开基本的业务设计 xff0c 消息模型的设计是其中最为关键的一环 xff0c 它关系到整个IM系统的可靠性 高效性
  • C++中4种方式把字符串和数字连接起来

    以前老用Java里面的String类 xff0c 用过的人都知道好舒服 xff0c 连接字符串和数字只需要用一个 43 号就可以了 在这里真的想把C 43 43 中string类 43 号功能加强一下 希望有能力的人可以做一下 xff0c
  • ROS系列教程一:工作空间及功能包创建

    前言 分享一下ROS开发的基础教程 xff0c 全部自己手敲 xff0c 希望能帮到正在学习的你 ROS在WIKI上也有教程 xff0c 个人觉得太过臃肿 xff0c 可以简化点 xff0c 毕竟大家都赶着投胎 xff0c 哈哈哈哈哈 一
  • 【算法技巧】数组连续子集操作---滑动窗口使用

    题目 已知一个数组arr 61 5 2 7 4 3 6 xff0c 求长度为k的连续连续子集和中最大值 解题思路 想法1 首先是比较容易想到的思路 xff0c 即利用双层循环进行遍历 xff0c 代码如下 xff1a span class