面试经典150题——长度最小的子数组

​"In the midst of winter, I found there was, within me, an invincible summer." - Albert Camus

mountain reflection on body of water

1. 题目描述

2.  题目分析与解析

首先理解题意,题目要求我们找到一个长度最小的 连续子数组 满足他们的和大于target,需要返回的是子数组的长度。现在我们想一下,对于一个根本不懂编程的人而言,他会怎么解这个题目。因为算法无非就是不同的人根据题目采用的不同的方法去解决的,本质上还是人来解决,所以在每一个编程题目尤其是算法题目之前,尝试想一想一个不懂编程的人会怎么完成这个题目会对我们的编程带来很大的帮助。

2.1 思路一——暴力求解

对于一个普通人而言,一般而言,他会从前向后首先从第一个位置,从前向后加看到第几个数字满足条件,再从第二个数字开始,以此循环,直到找到最小值。图解如下:

对于这种解决方式而言,是肯定能解决出题目的,如果每一个位置都单纯从前向后遍历直到和大于target,那么时间复杂度为O(n^2)。因为假设target很大,没有解,那么每一次都要遍历到结尾,设数组长度为N,那么时间复杂度如下:

但是实际情况是加入第一次从开头遍历到结尾都没有大于target,肯定就不需要继续遍历了,因为所有数字的和都小于target,那就代表没有解了。所以时间复杂度不会很大,是可以通过的。

2.2 思路二——滑动窗口

以下内容引自数据结构和算法(如侵权请告知,立即删除)

我们把数组中的元素不停的入队,直到总和大于等于 s 为止,接着记录下队列中元素的个数,然后再不停的出队,直到队列中元素的和小于 s 为止(如果不小于 s,也要记录下队列中元素的个数,这个个数其实就是不小于 s 的连续子数组长度,我们要记录最小的即可)。接着再把数组中的元素添加到队列中……重复上面的操作,直到数组中的元素全部使用完为止。

我着重想讲一下为什么这样做是可以得到更好的时间复杂度。

  • 当目前的和小于target,就一直向后加,当我走到一个位置加起来大于等于target,就需要进行处理,而处理的内容就是将队列出队,并且不断更新最小序列长度,直到队列里的内容的和小于target,再继续向后走。

  • 我们知道队列的性质是先进先出,之所以要出队到内部的和小于target,是因为我们知道从队列头元素一直加到当前元素和才开始大于等于target。那么移除头元素就相当于从第二个元素开始相加,一直加到当前元素,我再判断它是否大于等于target。因此实际上每移除队列头部的一个元素,就相当于起始点向后移动了一位,从那一位加到当前位,判断是否还是大于等于target,如果满足,那新的最小长度就可以更新,直到小于target就停止。当发现现在队列又开始小于target了,就说明从这个位置开始我又要在现在队列的基础上扩充直到大于等于target。

  • 使用这种方法的好处就是减少了多次求和运算,因为我每移除一个头部元素,只需要进行一次减法,也就相当于暴力求解中更换了一次开始位置。而如果队列中元素和小于target时,再在现在和的基础上扩充,只需要加一个数字,也避免了前面重复的加法运算。所以这种方法能够很有效的提升时间复杂度。

3. 代码实现

3.1暴力求解

3.2 滑动窗口

4. 相关复杂度分析

4.1 暴力求解

  • 时间复杂度:O(n^2),其中 nnn 是数组的长度。需要遍历每个下标作为子数组的开始下标,对于每个开始下标,需要遍历其后面的下标得到长度最小的子数组。

  • 空间复杂度:O(1)。

4.2 滑动窗口

  • 时间复杂度:O(n),其中 n 是数组的长度。指针 point1和point2 最多各移动 n 次。

  • 空间复杂度:O(1)。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

架构篇34:深入理解微服务架构 - 银弹 or 焦油坑?

文章目录 微服务与 SOA 的关系微服务的陷阱小结 微服务是近几年非常火热的架构设计理念,大部分人认为是 Martin Fowler 提出了微服务概念,但事实上微服务概念的历史要早得多,也不是 Martin Fowler 创造出来的,Martin 只是将微服务…

论文介绍 One-step Diffusion 只需单步扩散生成!

论文介绍 One-step Diffusion with Distribution Matching Distillation 关注微信公众号: DeepGo 源码地址: https://tianweiy.github.io/dmd/ 论文地址: https://arxiv.org/abs/2311.18828 这篇论文介绍了一种新的图像生成方法,名为分布匹配…

一、Docker/安装包部署ClickHouse

Docker/安装包部署ClickHouse 一、docker部署1.安装Docker2.拉取ClickHouse镜像2.1 选择拉取版本2.2 拉取镜像 3.启动ClickHouse3.1 确定好挂载目录3.2 测试环境3.3 生产环境3.1.1 获取配置文件3.1.2 配置文件中添加用户3.1.3 启动容器 4.使用DBeaver连接 二、安装包安装1.准备…

Seurat - 聚类教程 (1)

设置 Seurat 对象 在本教程[1]中,我们将分析 10X Genomics 免费提供的外周血单核细胞 (PBMC) 数据集。在 Illumina NextSeq 500 上对 2,700 个单细胞进行了测序。可以在此处[2]找到原始数据。 我们首先读取数据。 Read10X() 函数从 10X 读取 cellranger 管道的输出&…

Java实现陕西非物质文化遗产网站 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 设计目标2.2 研究内容2.3 研究方法与过程2.3.1 系统设计2.3.2 查阅文献2.3.3 网站分析2.3.4 网站设计2.3.5 网站实现2.3.6 系统测试与效果分析 三、系统展示四、核心代码4.1 查询民间文学4.2 查询传统音乐4.3 增改传统舞…

宿舍报修|宿舍报修小程序|基于微信小程序的宿舍报修系统的设计与实现(源码+数据库+文档)

宿舍报修小程序目录 目录 基于微信小程序的宿舍报修系统的设计与实现 一、前言 二、系统功能设计 三、系统实现 1、用户小程序功能模块 2、学生信息管理 3、维修人员管理 4、故障上报管理 5、论坛信息管理 四、数据库设计 1、实体ER图 2、具体的表设计如下所示&…

C++STL速查手册

本文参考cppreference,整理了一些常用的STL容器及其内置函数与算法,方便查用。 CSTL速查手册 什么是STL?STL模板 什么是STL? 在C中,STL 是指标准模板库(Standard Template Library)。STL 是 C 标…

【51单片机】LED点阵屏(江科大)

9.1LED点阵屏 1.LED点阵屏介绍 LED点阵屏由若干个独立的LED组成,LED以矩阵的形式排列,以灯珠亮灭来显示文字、图片、视频等。 2.LED点阵屏工作原理 LED点阵屏的结构类似于数码管,只不过是数码管把每一列的像素以“8”字型排列而已。原理图如下 每一行的阳极连在一起,每一列…

一周学会Django5 Python Web开发-Django5操作命令

锋哥原创的Python Web开发 Django5视频教程: 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计11条视频,包括:2024版 Django5 Python we…

2024.2.12日总结

今天去拜年去了,白天基本上都在外面,明天也是要去拜年,这几天学习的时间挺少的,但是还是要抓紧这些时间快点写项目,要找一些好用的插件,把项目和仓库新建好,然后下一步按照原型图的样子把页面画…

基础IO[一]

文件文件内容属性 文件在硬盘上放着,我们的流程->写代码->编译->运行->访问文件。那么本质上是谁在访问? 是进程在访问。进程访问文件是需要通过接口来访问。 文件在磁盘上放着,要向硬件写入文件,谁有权限呢?必须…

java之Maven

1. maven Maven是管理和构建java项目的工具 项目依赖资源(jar包)的管理,避免版本冲突统一项目结构项目构建,标准跨平台(Linux,window,MacOS)的自动化项目管理 2.maven依赖仓库 2.maven安装 maven安装视频教程 3. IDEA集成Maven 4. maven的依赖范围 5. maven生命…

从基建发力,CESS 如何推动 RWA 发展?

2023 年 11 月 30 日,Web3 基金会(Web3 Foundation)宣布通过 Centrifuge 将部分资金投资于 RWA(Real World Assets,真实世界资产),试点投资为 100 万美元。Web3 基金会旨在通过支持专注于隐私、…

代码随想录刷题笔记 DAY 24 | 回溯算法理论基础 | 组合问题 No. 77

文章目录 Day 2401. 回溯算法理论基础1.1 什么是回溯法?1.2 为什么要使用回溯法?1.3 如何理解回溯法? 02. 组合问题(No. 77)2.1 题目2.2 笔记2.3 代码 Day 24 01. 回溯算法理论基础 1.1 什么是回溯法? &…

网络安全检查表

《网络攻击检查表》 1.应用安全漏洞 2.弱口令,默认口令 3.服务器互联网暴露 4.操作系统,中间件安全漏洞 5.研发服务器,邮件服务器等安全检查

python+django高校活动报名场地管理系统l1ro4

校园活动管理平台程序的开发,在数据库的选择上面,选择功能强大的MySQL数据库进行数据的存放操作。 技术栈 后端:python 前端:vue.jselementui 框架:django Python版本:python3.7 数据库:mysql5…

交叉熵损失函数(Cross-Entropy Loss)的基本概念与程序代码

交叉熵损失函数(Cross-Entropy Loss)是机器学习和深度学习中常用的损失函数之一,用于分类问题。其基本概念如下: 1. 基本解释: 交叉熵损失函数衡量了模型预测的概率分布与真实概率分布之间的差异。在分类问题中&…

apk反编译修改教程系列---简单修改apk默认横竖屏显示 手机端与电脑端同步演示【十一】

往期教程: apk反编译修改教程系列-----修改apk应用名称 任意修改名称 签名【一】 apk反编译修改教程系列-----任意修改apk版本号 版本名 防止自动更新【二】 apk反编译修改教程系列-----修改apk中的图片 任意更换apk桌面图片【三】 apk反编译修改教程系列---简单…

Impala-架构与设计

架构与设计 一、背景和起源二、框架概述1.设计特点2.框架优点3.框架限制 三、架构图1.Impala Daemon2.Statestore3.Catalog 四、Impala查询流程1.发起查询2.生成执行计划3.分配任务4.交换中间数据5.汇集结果6.返回结果 总结参考链接 一、背景和起源 现有的大数据查询分析工具H…

Microsoft Word 超链接

Microsoft Word 超链接 1. 取消超链接2. 自动超链接2.1. 选项2.2. 校对 -> 自动更正选项2.3. Internet 及网络路径替换为超链接 References 1. 取消超链接 Ctrl A -> Ctrl Shift F9 2. 自动超链接 2.1. 选项 2.2. 校对 -> 自动更正选项 ​​​ 2.3. Internet…