leetcode分类刷题:易混题辨析一、209. 长度最小的子数组 vs 560. 和为K的子数组

1、刷题慢慢积累起来以后,遇到相似的题目时,会出现算法思路混淆了
2、这两道题都是对连续子数组加和进行考察,细节区别在于数组元素在209. 长度最小的子数组为正整数(窗口增加元素递增,减少元素递减),在560. 和为K的子数组为整数
3、209. 长度最小的子数组采用滑动窗口的算法,560. 和为K的子数组采用前缀和+哈希表的算法

209. 长度最小的子数组

1、有点像leetcode分类刷题:基于数组的双指针(一、基于元素移除的O(1)类型)中的快慢指针,快指针遍历数组元素,慢指针在满足一定条件时更新。
2、同时,要注意 基本子数组类型 更新窗口左边界时用while循环

from typing import List
'''
209. 长度最小的子数组
题目描述:给定一个含有n个正整数的数组和一个正整数target。
找出该数组中满足其和 ≥target的 长度最小的 连续子数组[numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。
如果不存在符合条件的子数组,返回 0 。
示例 1:输入:target = 7, nums = [2,3,1,2,4,3]输出:2解释:子数组 [4,3] 是该条件下的长度最小的子数组
题眼:≥target的 长度最小的 连续子数组;
注意:因为这道题保证了数组中每个元素都为正,所以窗口增加元素递增,减少元素递减
思路:滑动窗口(双指针的特殊形式),设置窗口左右边界[left, right],初始值均为0,右边界遍历数组,满足条件后,while循环更新左边界,
关键在于思考清楚窗口的左右边界如何更新(和基于数组的双指针的题目同理)
总结:这个题的思路怎么想到双指针呢?首先数组必然要遍历,需要一个指针,另外要去寻找满足条件的子数组,必然再需要另一个(和基于数组的双指针的题目同理)
'''class Solution:def minSubArrayLen(self, target: int, nums: List[int]) -> int:left, right = 0, 0s = 0result = len(nums) + 1  # 取一个大于数组长度的值for right in range(len(nums)):# 1、当移动right扩大窗口,进行哪些操作s += nums[right]# 2、什么条件下,窗口应该暂停扩大,开始移动left缩小窗口while s >= target:# 3、缩小窗口进行哪些操作# 4、更新结果result = min(result, right - left + 1)  # 滑窗[left, right]是左闭右闭区间,子数组长度==元素个数s -= nums[left]left += 1right += 1if result != len(nums) + 1:  # 不存在符合条件的子数组:所有元素加起来都小于targetreturn resultreturn 0if __name__ == "__main__":obj = Solution()while True:try:in_line = input().strip().split('=')target = int(in_line[1].split(',')[0].strip())nums = [int(n) for n in in_line[2].split(']')[0].split('[')[1].split(',')]print(obj.minSubArrayLen(target, nums))except EOFError:break

560. 和为 K 的子数组

1、通过题眼连续子数组来判断,该题很像是滑动窗口的解法,但数组元素为整数,不是正整数,不满足滑窗右边界增大元素之和递增、左指针增大元素之和递减
2、要用前缀和(按照闭区间形式,当前索引位置的值也算进去好理解)+哈希表的思路!
3、通过这道题也认识到,如果“1. 两数之和”不是限定了样例只存在一个答案,其哈希表更新的逻辑有缺陷

from typing import List
'''
560. 和为 K 的子数组
题目描述:给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的连续子数组的个数 。
示例 1:输入:nums = [1,1,1], k = 2输出:2
题眼:连续子数组,很像是滑动窗口的解法,但数组元素为整数,不是正整数,不满足滑窗右边界增大元素之和递增、左指针增大元素之和递减 了
思路:无法用滑动窗口了;要用前缀和(按照闭区间形式,当前索引位置的值也算进去好理解)+哈希表的思路!
“1. 两数之和”的扩展:通过这道题也认识到,如果“1. 两数之和”不是限定了样例只存在一个答案,其哈希表更新的逻辑有缺陷
'''class Solution:def subarraySum(self, nums: List[int], k: int) -> int:result = 0hashTable = {0: 1}  # 这里保证了对 包含起始元素的连续子数组 的判断prefixSum = 0for n in nums:  # 查找 以当前遍历元素n对应的索引位置为 右边界的连续子数组prefixSum += n   # 前缀和(按照闭区间形式,当前索引位置的值也算进去好理解)# 1、先找 以当前遍历元素n对应的索引位置 之前的前缀和是否存在满足条件的if prefixSum - k in hashTable:result += hashTable[prefixSum - k]# 2、再将当前遍历元素n对应的索引位置 的前缀和添加到hashDictif prefixSum not in hashTable:hashTable[prefixSum] = 1else:hashTable[prefixSum] += 1return resultif __name__ == "__main__":obj = Solution()while True:try:in_line = input().strip().split('=')nums = [int(n) for n in in_line[1].split('[')[1].split(']')[0].split(',')]k = int(in_line[2].strip())print(obj.subarraySum(nums, k))except EOFError:break

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

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

相关文章

linux 进程管理命令

进程管理命令 查看进程命令 ps命令 显示系统上运行的进程列表 # 查看系统中所有正在运行的系统ps aux# 获取占用内存资源最多的10个进程,可以使用如下命令组合:ps aux|head -1;ps aux|grep -v PID|sort -rn -k 4|head# 获取占用CPU资源最多的10个进程&am…

PXE批量装机

目录 前言 一、交互式 (一)、搭建环境 (二)、配置dhcp服务 (三)、FTP服务 (四)、配置TFTP服务 (五)、准备pxelinx.0文件、引导文件、内核文件 &#…

C#开发的OpenRA游戏之信标按钮

前面已经分析了两个按钮:变卖和维修,接着下来就是分析信标按钮,这个按钮使用是比较少,但是对于多人游戏时,使用这个信号就很方便同盟军过来查看和帮助了,相当于一个朋友之间共同查看的地址。当你经过同盟标记的标志时,就会听到beacon detected,检测到信标,这就是你的盟…

如何系统地学习 JavaScript?

前言 在学习JavaScript前需要先将Html和Css的相关知识点弄清楚,Js的很多操作是要结合Html和Css,下面我总结了Html、Css和Js的相关学习知识点供参考,希望对你有所帮助喔~ Html 文档学习 【HTML 】w3school教程 :https://www.w3school.com.…

【SpringBoot入门】详解@Autowired的使用

【SpringBoot入门】详解Autowired的使用 在构造函数中使用Autowired的注解的简单实例除了构造函数,Autowired注解还可以用在哪些地方?方法上:字段上:Setter方法上:构造函数参数上: 在构造函数中使用Autowir…

Java分别用BIO、NIO实现简单的客户端服务器通信

分别用BIO、NIO实现客户端服务器通信 BIONIONIO演示(无Selector)NIO演示(Selector) 前言: Java I/O模型发展以及Netty网络模型的设计思想 BIO Java BIO是Java平台上的BIO(Blocking I/O)模型&a…

树状数组,线段树,容斥,P3801 红色的幻想乡

P3801 红色的幻想乡 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目背景 蕾米莉亚的红雾异变失败后,很不甘心。 题目描述 经过上次失败后,蕾米莉亚决定再次发动红雾异变,但为了防止被灵梦退治,她决定将红雾以奇怪的阵势释…

监控基本概念

监控:这个词在不同的上下文中有不同的含义,在讲到监控MySQL或者监控Redis时,这里只涉及数据采集和可视化,不涉及告警引擎和事件处理。要是监控系统的话,不但包括数据采集和可视化,而且也包括告警和事件发送…

【深入解析spring cloud gateway】02 网关路由断言

一、断言(Predicate)的意义 断言是路由配置的一部分,当断言条件满足,即执行Filter的逻辑,如下例所示 spring:cloud:gateway:routes:- id: add_request_header_routeuri: https://example.orgpredicates:- Path/red/{segment}filters:- AddR…

Python 编程秘籍:掌握这些,你还会担心写不出高效代码吗?

建议点击下面原文链接,效果更佳 Python 编程秘籍:掌握这些,你还会担心写不出高效代码吗? 在 Python 编程的世界里,高手们常常掌握着一些不为人知的独门绝技。这些技巧不仅让他们在编程时如虎添翼,还让他们…

Kafka3.0.0版本——文件存储机制

这里写木目录标题 一、Topic 数据的存储机制1.1、Topic 数据的存储机制的概述1.2、Topic 数据的存储机制的图解1.3、Topic 数据的存储机制的文件解释 二、Topic数据的存储位置示例 一、Topic 数据的存储机制 1.1、Topic 数据的存储机制的概述 Topic是逻辑上的概念&#xff0c…

ASP.NET Core 中基于 Controller 的 Web API

基于 Controller 的 Web API ASP.NET Wep API 的请求架构 客户端发送Http请求,Contoller响应请求,并从数据库读取数据,序列化数据,然后通过 Http Response返回序列化的数据。 ControllerBase 类 Web API 的所有controllers 一般…

uni-app app端.m3u8类型流的播放

1.开发环境:HBuilderX3.8.7、uni-app、vue2.0、view2.0、uni-ui 2.实现通过web-view 嵌入H5页面,进行视频流自动播放。 注意事项: 如果只是在android端可以直接使用.flv格式的视频流; 如果App需要支持ios就可以考虑一下播放.m3u8格…

植物大战僵尸植物表(二)

前言 此文章为“植物大战僵尸”专栏中的第007刊(2023年9月第六刊)。 提示: 1.用于无名版; 2.用于1代; 3.pvz指植物大战僵尸(Plants VS Zonbies)。 植物大战僵尸植物表 土豆雷窝瓜火炬树桩火爆辣椒杨…

Spring MVC @Controller和@RequestMapping注解

Controller 注解 Controller 注解可以将一个普通的 Java 类标识成控制器(Controller)类,示例代码如下。 package net.biancheng.controller; import org.springframework.stereotype.Controller; Controller public class IndexController …

数学建模:拟合算法

🔆 文章首发于我的个人博客:欢迎大佬们来逛逛 数学建模:拟合算法 文章目录 数学建模:拟合算法拟合算法多项式拟合非线性拟合cftool工具箱的使用 拟合算法 根据1到12点间的温度数据求出温度与时间之间的近似函数关系 F ( t ) F(…

【FPGA项目】沙盘演练——基础版报文收发

​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ 第1个虚拟项目 前言 点灯开启了我们的FPGA之路,那么我们来继续沙盘演练。 用一个虚拟项目,来入门练习,以此步入数字逻辑的大门。 Key Words&…

【网络编程】TCP/IP协议(互联网的基石)

(꒪ꇴ꒪ ),Hello我是祐言QAQ我的博客主页:C/C语言,数据结构,Linux基础,ARM开发板,网络编程等领域UP🌍快上🚘,一起学习,让我们成为一个强大的攻城狮&#xff0…

Go语言最全面试题,拿offer全靠它,附带免积分下载pdf

面试题文档下链接点击这里免积分下载 go语言入门到精通点击这里免积分下载 文章目录 Go 基础类GO 语言当中 NEW 和 MAKE 有什么区别吗?PRINTF(),SPRINTF(),FPRINTF() 都是格式化输出,有什么不同?GO 语言当中数组和切片的区别是什么&#xf…