lc209. 长度最小的子数组

news2024/12/23 19:23:59

题目:

给定一个含有 n 个正整数的数组和一个正整数 target

找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0

思路:

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

本题可以使用滑动窗口就是不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果

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

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

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

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

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

窗口就是 满足其和 ≥ s 的长度最小的 连续 子数组。

窗口的起始位置如何移动:如果当前窗口的值大于等于s了,窗口就要向前移动了(也就是该缩小了)。

窗口的结束位置如何移动:窗口的结束位置就是遍历数组的指针,也就是for循环里的索引。

解题的关键在于 窗口的起始位置如何移动,如图所示:

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

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        //双指针-滑动窗口思想
        //两个指针指向所求的连续子数组的两侧
        //起始左右指针都指向nums[0],定义sum记录集合中的数值和,定义length记录连续子数组的最小长度
        //右指针不断右移,并且更新连续子数组的数值和sum
        // 若sum >= target,则将左指针不断右移并且sum中减去nums[left],直至sum < target.并且判断并更新length
        // 若sum < target,则继续右移左指针直到sum >= target.
        
        int sum = 0,length = 0x3f3f3f3f;
        int subL = 0;//记录每个数值和 >= target 的连续子数组长度,用于与length比较取最小
        
        for (int left = 0,right = 0; right < nums.length; right++) {
            sum += nums[right];
            while (sum >= target){
                sum -= nums[left];
                subL =right - left + 1;
                //length与当前数组长度比较取最小
                length = Math.min(length, subL);
                left++;
            }
        }
        
        //有可能整个数组之和相加都 < target,这种情况没有进入while循环进行比较赋值,此处进行三元判断
        return length == 0x3f3f3f3f ? 0 : length;
    }
}

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

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

相关文章

非刚性ICP算法

非刚性ICP配准通过对V上的每个顶点v_i&#xff0c;利用仿射变换X_i来对模板网格进行变形。由此将V形变成为一个形变模板网格V^′&#xff0c;使得V^′与目标数据T的形状越接近越好&#xff0c;即V^′上的每个顶点在T上的对应点为该顶点在T中的最近点。该过程的目标函数如下&…

原生js: AI聊天功能, 仿照chatGPT问答功能

问: 现在我们需要一个ai聊天功能, 接口已经给出: 只要是message就是我们的数据, 是message_end就是结束信息, 其他的我们不需要管. 回答: 我们不使用传统的fetch请求这个接口, 而是使用sse, eventSource去请求, 当我们输入框回车 或者 点击元素, 获取到输入框中用户输入的值…

stm32入门学习10-软件I2C和陀螺仪模块

&#xff08;一&#xff09;I2C通信 &#xff08;1&#xff09;通信方式 I2C是一种同步半双工的通信方式&#xff0c;同步指的是通信双方时钟为一个时钟&#xff0c;半双工指的是在同一时间只能进行接收数据或发送数据&#xff0c;其有一条时钟线&#xff08;SCL&#xff09;…

MyBatis补充

控制类和dao层接口以及mapper中的xml是怎样的关联的&#xff1f; 在Mybatis中&#xff0c;控制类和dao层接口是通过mapper的xml文件进行连接的。 控制类调用dao层接口中的方法&#xff0c;通过接口实现进行访问数据库操作。dao层接口定义数据库操作的方法&#xff0c;提供给控制…

第6章>>实验7:PS(ARM)端Linux RT与PL端FPGA之间(通过Memory存储器进行通信和交互)《LabVIEW ZYNQ FPGA宝典》

1、实验内容 上一节实验里面介绍的Reg寄存器通道比较适合在PS端和PL端之间传递标量数据&#xff0c;也就是单个元素&#xff0c;如果要传递多个元素的数组或者连续数据流的话&#xff0c;Reg寄存器通道就不是很合适了。 本节实验我们向大家讲解如何借助Memory存储器通道在PS&am…

【Mind+】掌控板入门教程06 多彩呼吸灯

呼吸灯是指模仿动物一呼一吸使灯光由亮到暗逐渐变化&#xff0c;给人以安静沉稳的感觉。电子产品中经常会使用不同色彩的呼吸灯&#xff0c;起到很好的视觉提醒效果。 这个项目中我们将带领大家用掌控板制作一个颜色和亮度一起变化的多彩呼吸灯&#xff01; 项目示例 …

编程深水区之并发④:Web多线程

Node的灵感来源于Chrome&#xff0c;更是移植了V8引擎。在Node中能够实现的多线程&#xff0c;在Web环境中自然也可以。 一、浏览器是多进程和多线程的复杂应用 在本系列的第二章节&#xff0c;有提到现代浏览器是一个多进程和多线程的复杂应用。浏览器主进程统管全局&#xf…

vue动态规则

vue动态规则 在Vue中&#xff0c;可以使用动态规则来实现灵活的表单验证和输入限制。动态规则允许你根据特定条件或动态数据来定义验证规则。 以下是一个示例&#xff0c;展示如何在Vue中使用动态规则&#xff1a; <template><div><input v-model"inputVa…

LVS--DR模式

目录 1 DR模式原理 2 DR模式请求回复过程 3 实验环境 4 开始实验 4.1 配置实验环境 4.2 Router 配置路由转发 4.3 LVS 设置转发规则 4.4 解决vip响应问题 4.5 Web1配置 4.6 Web2配置 5 测试效果 1 DR模式原理 当用户向负载均衡调度器&#xff08;Director Server&#xff09;发…

如何用数字便签管理工作任务?

在快节奏的工作环境中&#xff0c;我们每天都需要处理大量的工作任务。如果仅仅依靠个人的记忆力和精力&#xff0c;很容易导致任务遗漏或者延误。随着数字化技术的发展&#xff0c;选择一款功能强大的数字便签软件已经成为我们管理工作任务的更好选择。 在众多的数字便签软件…

Java零基础之多线程篇:讲解并发集合

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

c语言11天笔记

函数的概述 函数&#xff1a;实现一定功能的&#xff0c;独立的代码模块。我们的函数一定是先定义&#xff0c;后使用。 使用函数的优势&#xff1a; 1. 我们可以通过函数提供功能给别人使用。当然我们也可以使用别人提供的函数&#xff0c;减少代码量。 2. 借助函数可以减…

4.6.长短期记忆网络(LSTM)

长短期记忆网络(LSTM) ​ 长短期记忆网络的设计灵感来自于计算机的逻辑门。 长短期记忆网络引入了记忆元&#xff08;memory cell&#xff09;&#xff0c;或简称为单元&#xff08;cell&#xff09;。 有些文献认为记忆元是隐状态的一种特殊类型&#xff0c; 它们与隐状态具有…

萱仔求职系列——1.1 机器学习基础知识复习

由于我最近拿到offer还是想再找找更好的机会&#xff0c;目前有很多的面试&#xff0c;面试的时候很多面试官会问一些机器学习的基础知识&#xff0c;由于我上一段实习的时候主要是机器学习和部分深度学习的内容&#xff0c;为了避免在面试的时候想不起来自己学习的内容&#x…

MPU6050的STM32数据读取

目录 1. 概述2. STM32G030对MPU6050的读取3. STM32F1xx对MPU6050的读取 1. 概述 项目中&#xff0c;往往需要根据不同的环境使用不同的芯片处理某些数据&#xff0c;当使用不同的芯片对六轴陀螺仪芯片MPU6050进行数据处理中&#xff0c;硬件的连接、I/O口的设置往往需要根据相…

【HarmonyOS NEXT星河版开发学习】小型测试案例05-得物列表项

个人主页→VON 收录专栏→鸿蒙开发小型案例总结​​​​​ 基础语法部分会发布于github 和 gitee上面&#xff08;暂未发布&#xff09; 前言 鸿蒙操作系统通过其先进的分布式架构和开发工具&#xff0c;以及灵活的界面布局和样式控制&#xff0c;为开发者提供了丰富的开发资源…

设计模式- 数据源架构模式

活动记录&#xff08;Active Record&#xff09; 一个对象&#xff0c;它包装数据库表或视图中的某一行&#xff0c;封装数据库访问&#xff0c;并在这些数据上增加了领域逻辑 对象中既有数据又有行为。这些数据大多是持久数据、并且需要保存到数据库。 运行机制 活动记录的…

Iris for mac 好用的录屏软件

Iris 是一款高性能屏幕录像机&#xff0c;可录制到 h.264。Iris 在可用时利用板载 GPU 加速。它可以选择包括来自摄像头和最多两个麦克风的视频。 兼容性 所有功能在macOS 11.0-14上完全支持&#xff0c;包括macOS Sonoma。 简单编码 直接录制为h.264、h.265、ProRes或Motion…

WPF学习(10)-Label标签+TextBlock文字块+TextBox文本框+RichTextBox富文本框

Label标签 Label控件继承于ContentControl控件&#xff0c;它是一个文本标签&#xff0c;如果您想修改它的标签内容&#xff0c;请设置Content属性。我们曾提过ContentControl的Content属性是object类型&#xff0c;意味着Label的Content也是可以设置为任意的引用类型的。 案…

游戏ID统一管理器DEMO

一般游戏的角色ID、名字&#xff0c;工会ID、名字&#xff0c;等最好统一创建&#xff0c;方便合服处理&#xff0c;可以以此基础&#xff0c;动态配置生成ID 这个也可以用openresty 作个&#xff0c;可能更专业点&#xff0c; 1&#xff1a;go1.20 最后一版支持win7的 mongod…