代码随想录算法训练营第二天|【数组】209.长度最小的子数组

题目

给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。

示例:

输入:s = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。
提示:

1 <= target <= 10^9
1 <= nums.length <= 10^5
1 <= nums[i] <= 10^5

思路

  1. 暴力法
    两个for循环,然后不断的寻找符合条件的子序列
    时间复杂度O(n^2)

  2. 滑动窗口法
    在这里插入图片描述

    所谓滑动窗口,就是不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果。

    在暴力解法中,是一个for循环滑动窗口的起始位置,一个for循环为滑动窗口的终止位置,用两个for循环 完成了一个不断搜索区间的过程。

    那么滑动窗口如何用一个for循环来完成这个操作呢。

    首先要思考 如果用一个for循环,那么应该表示 滑动窗口的起始位置,还是终止位置。

    如果只用一个for循环来表示 滑动窗口的起始位置,那么如何遍历剩下的终止位置?

    此时难免再次陷入 暴力解法的怪圈。

    所以 只用一个for循环,那么这个循环的索引,一定是表示 滑动窗口的终止位置。

滑动窗口的精妙之处在于根据当前子序列和大小的情况,不断调节子序列的起始位置。从而将O(n^2)暴力解法降为O(n)。

定义两个指针 start 和 end 分别表示子数组(滑动窗口窗口)的开始位置和结束位置,维护变量 sum 存储子数组中的元素和(即从 nums[start] 到 nums[end] 的元素和)。
初始状态下,start 和 end 都指向下标 0,sum 的值为 0。
每一轮迭代,将 nums[end] 加到 sum,如果 sum≥s,则更新子数组的最小长度(此时子数组的长度是 end−start+1),然后将 nums[start] 从 sum 中减去并将 start 右移,直到 sum<s,在此过程中同样更新子数组的最小长度。在每一轮迭代的最后,将 end 右移。

solution

Python:
(版本一)滑动窗口法

class Solution:def minSubArrayLen(self, s: int, nums: List[int]) -> int:l = len(nums)left = 0right = 0min_len = float('inf')cur_sum = 0 #当前的累加值while right < l:cur_sum += nums[right]while cur_sum >= s: # 当前累加值大于目标值min_len = min(min_len, right - left + 1)cur_sum -= nums[left]left += 1right += 1return min_len if min_len != float('inf') else 0

(版本二)暴力法

class Solution:def minSubArrayLen(self, s: int, nums: List[int]) -> int:l = len(nums)min_len = float('inf')for i in range(l):cur_sum = 0for j in range(i, l):cur_sum += nums[j]if cur_sum >= s:min_len = min(min_len, j - i + 1)breakreturn min_len if min_len != float('inf') else 0

参考:

  • https://leetcode.cn/problems/minimum-size-subarray-sum/solutions/305704/chang-du-zui-xiao-de-zi-shu-zu-by-leetcode-solutio/
  • https://programmercarl.com/0209.%E9%95%BF%E5%BA%A6%E6%9C%80%E5%B0%8F%E7%9A%84%E5%AD%90%E6%95%B0%E7%BB%84.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE

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

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

相关文章

创建React项目

使用 create-react-app快速搭建开发环境 create-react-app 是一个快速创建React开发环境的工具&#xff0c;底层由Webpack构建&#xff0c;封装了配置细节&#xff0c;开箱即用。 安装npx npx是一个由Node.js官方提供的用于快速执行npm包中的可执行文件的工具&#xff0c;np…

Spring 泛型依赖注入

Spring 泛型依赖注入&#xff0c;是利用泛型的优点对代码时行精简&#xff0c;将可重复使用的代码全部放到一个类之中&#xff0c;方便以后的维护和修改&#xff0c;同时在不增加代码的情况下增加代码的复用性。 示例代码&#xff1a; 创建实体类 Product package test.spri…

Windows安装Visual Studio Code(VS Code) (配图超详细!)

一、下载 官方网站&#xff1a;https://code.visualstudio.com/download 二、安装 1、安装之前先在目的安装路径中新建文件夹存放待会要安装的程序&#xff08;因为在安装过程中选择安装路径时无法现场新建文件夹&#xff09;。 2、在下载目录中找到安装包并双击运行&#xf…

大模型在运维领域中的应用

大模型在运维领域中的应用日益广泛&#xff0c;其强大的数据处理、自动化和智能化能力为运维工作带来了显著的效率和质量提升。以下是大模型在运维领域中的具体应用及其优势的详细说明&#xff1a; 一、大模型在运维领域的应用 故障检测与诊断 自动化检测&#xff1a;大模型通…

Linux - Shell 以及 权限问题

目录 Shell的运行原理 Linux权限问题 Linux权限的概念 如何实现用户账号之间的切换 如何仅提升当前指令的权限 如何将普通用户添加到信任列表 Linux权限管理 文件访问者的分类&#xff08;人&#xff09; 文件类型和访问权限&#xff08;事物属性&#xff09; 文件权限值的表…

Keycloak SSO 如何验证已添加的 SPN 是否生效

使用 Kerberos Ticket 验证&#xff1a; 在客户端计算机上&#xff0c;运行以下命令以获取 Kerberos Ticket&#xff1a; klist检查是否存在与 HTTP/yourdomain.com 相关的票证。如果存在&#xff0c;说明 SPN 已生效。 测试应用程序&#xff1a; 使用具有 HTTP/yourdomain.com…

H5实现第三方分享功能,(WhatsApp,Facebook,Messenger,Instagram,Telegram,Zalo,Twitter/X)

1. H5实现第三方分享功能 1. WhatsApp 分享 https://api.whatsapp.com/send/?phone&app_absent0&text${codeUrl}2. Facebook 分享 https://www.facebook.com/sharer/sharer.php?u${codeUrl}3. Messenger 分享 https://www.messenger.com/?${codeUrl}4. Instagra…

深入 Laravel 的错误处理与异常处理机制

引言 Laravel 是一个优雅而强大的 PHP Web 应用框架&#xff0c;它提供了一系列工具来帮助开发者处理应用中的错误和异常。了解 Laravel 的错误处理和异常处理机制对于构建健壮和用户友好的应用程序至关重要。本文将深入探讨 Laravel 如何实现错误和异常处理&#xff0c;并提供…

bond网络配置文件中master、slave-type

在bond网络配置文件中&#xff0c;"master"和"slave-type"是用于设置bond接口的关键词。 "master"关键词用于指定一个网络接口作为bond接口的主接口。例如&#xff0c;在配置文件中设置"master bond0"表示将接口"bond0"设置…

c++单例模式的一种写法

首言 在以前的文章中&#xff0c;我写了一种单例模式。不过那种写法会比较麻烦&#xff0c;要加好几行代码。如今看到了大佬写的新的单例模式&#xff0c;我进行了改进&#xff0c;比较好玩&#xff0c;现在记录下来。 大佬的单例模式 #include <stdexcept>template &…

RFID电子锁物流货运锁控解决方案

一、物流货运行业现状与痛点 货物安全问题&#xff1a;货物在运输过程中存在被盗、损坏的风险&#xff0c;尤其在长途运输和多式联运中。 运输效率低下&#xff1a;传统的锁控方式依赖人工检查&#xff0c;效率低下&#xff0c;且容易出错。 管理成本高昂&#xff1a;物理钥…

普通人如何利用GPT赚钱之如何利用GPT撰写广告文案

如何利用GPT撰写广告文案:从构思到发布的详细指南 在广告文案的世界里,创意和表达是制胜的法宝。而如今,人工智能正为这一领域带来革命性的变化。利用GPT撰写广告文案,不仅高效,而且趣味十足。接下来,我将为你详细介绍如何从构思到发布,巧妙运用GPT打造一篇引人入胜的广…

RouteLLM:高效LLM路由框架,可以动态选择优化成本与响应质量的平衡

该论文提出了一个新的框架&#xff0c;用于在强模型和弱模型之间进行查询路由选择。通过学习用户偏好数据&#xff0c;预测强模型获胜的概率&#xff0c;并根据成本阈值来决定使用哪种模型处理查询 。该研究主要应用于大规模语言模型&#xff08;LLMs&#xff09;的实际部署中&…

ip地址多长时间自动更换一次

IP地址自动更换的时间不是固定的&#xff0c;它取决于多个因素。 首先&#xff0c;如果日常使用的WiFi或有线网络的IP地址是动态的。这意味着&#xff0c;例如&#xff0c;当路由器的默认设置是7天或14天自动重启一次时&#xff0c;IP地址就会改变。此外&#xff0c;公共场所的…

详细分析Spring Boot 数据源配置的基本知识(附配置)

目录 前言1. 基本知识2. 模版3. 实战经验前言 对于Java的基本知识推荐阅读: java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)【Java项目】实战CRUD的功能整理(持续更新)1. 基本知识 包括数据源的概念、连接池的作用、多数据源的实现与管理、Druid 连接池…

NLP入门——前馈词袋分类模型的搭建、训练与预测

模型的搭建 线性层 >>> import torch >>> from torch import nn >>> class DBG(nn.Module): ... def forward(self,x): ... print(x.size()) ... return x ... >>> tmod nn.Sequential(nn.Linear(3,4),DB…

C语言实战 | Flappy Bird游戏

Flappy Bird游戏是由一名越南游戏制作者独自开发的&#xff0c;曾经风靡全球。游戏规则非常简单&#xff0c;玩家必须控制一只小鸟&#xff0c;跨越由各种长度的水管所组成的障碍物&#xff0c;如果撞上管道游戏就结束&#xff0c;如图11.11所示。 ■ 图11.11Flappy Bird 游戏 …

AOP与IOC详解

AOP&#xff08;Aspect Oriented Programming&#xff0c;面向切面编程&#xff09;和IOC&#xff08;Inversion of Control&#xff0c;控制反转&#xff09;是现代软件开发中两个重要的概念。虽然它们最初独立存在&#xff0c;但在实践中经常一起使用。在这篇文章中&#xff…

使用AES加密数据传输的iOS客户端实现方案

在现代应用开发中&#xff0c;确保数据传输的安全性是至关重要的。本文将介绍如何在iOS客户端中使用AES加密数据传输&#xff0c;并与服务器端保持加密解密的一致性。本文不会包含服务器端代码&#xff0c;但会解释其实现原理。 加密与解密的基本原理 AES&#xff08;Advance…

C语言实现的冒泡排序算法的示例程序

冒泡排序是一种简单的排序算法&#xff0c;它重复地遍历要排序的数列&#xff0c;一次比较两个元素&#xff0c;如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复地进行直到没有再需要交换&#xff0c;也就是说该数列已经排序完成。这个算法的名字由来是因为越小&…