力扣100题——子串

560.和为k的子数组

这道题目不是滑动窗口的类型,因为长度并不是固定的。(好的,我在说废话)

注意题目要求是子数组,且是连贯的。那这里的话,解法有很多,最简单的就是暴力解法,但在这里我想说的是前缀和加哈希表优化,嘿嘿,适当的参考了一下官方的解题办法。ok,来。

首先什么是前缀和,先看个列子:

有个数组:nums=[1,2,3,4,5,6],那么他的前缀和就是0,1,3,6,10,15,21。

当i=0的时候,前缀和是0,

当i=1的时候,前缀和是1,

当i=2的时候,前缀和是0+1+2=3,以此类推。

我们已经知道了前缀和的值和k的值,那想求的是题目要求的连续子数组和为k的数,那是不是只要把当前的前缀和-k就可以得到连续的子数组的和,我们之前是用一个数组来表示的,那如果说得到的那个值出现在了这个数组中,是不是就说明找到了,上代码:

class Solution {
    public int subarraySum(int[] nums, int k) {
       int count=0,pre=0;
       //定义一个map,来存放各个前缀和出现的次数
       HashMap<Integer,Integer> mp=new HashMap<>();
       //这个主要是用以考虑连续数组只有一个的情况,比如说例子2中的3
       mp.put(0,1);
       for(int i=0;i<nums.length;i++){
           pre+=nums[i];
           if(mp.containsKey(pre-k)){
               count+=mp.get(pre-k);
           }
           mp.put(pre,mp.getOrDefault(pre,0)+1);
       }
       return count;
    }
}

239、滑动窗口最大值

题解:这道题用了一个优先队列。在优先队列里面的元素是已经排列好的。要注意的是用C++和Python是不一样的。前者是默认从高到低对数组进行排列,而后者是从低到高,所以用python的时候需要注意要对其取负值。

解题思路:用优先队列,定义一个优先队列,然后将前面的k值放入队列中,将最大的那个元素存入数组中,接着利用for循环,从k值开始,将新元素放入队中,同时判断当前窗口中最大值是否在i-k中,如果不是则需要弹出

纠结点

1.就是用while循环弹出的是一系列吗?,存在的意义是什么。

while循环的目的在于弹出窗口中最大的元素,但要注意前提条件。如果此时窗口滑到了[-1,-1,-2],那前面所有大于这个窗口里面的最大值都要出队pop掉,看个例子吧,我放个代码,看看就懂了。

import heapq
class Solution:
    def maxSlidingWindow(nums, k):
        n = len(nums)
        # 注意 Python 默认的优先队列是小根堆
        q = [(-nums[i], i) for i in range(k)]
        #这里的作用是将其调整成为一个大根堆,q本身就发生了改变,并返回none
        heapq.heapify(q)
        ans = [-q[0][0]]
        for i in range(k, n):
            heapq.heappush(q, (-nums[i], i))
            while q[0][1] <= i - k:
                # print("当前的k,i:",k,i)
                print("弹出的q值为:",q[0][0])
                #将q对列中弹出最小的元素
                heapq.heappop(q)
                # print("弹出之后的q值",q)
            ans.append(-q[0][0])
            print("q2的值为", q)
        return ans
nums=[1,0,-1,-3,5,3,6,7,9,10,-1,-1,-2,-3,3,2,3,1]
nums1=[1]
k=3
m=Solution.maxSlidingWindow(nums,k)
print(m)

2.python代码的误解

heapq.heappop(q),这串代码的意思是弹出q中最小的元素,所以print(q)是输出q这个队列里面的所有元素,而不只是队列中最大的元素

3、当窗口右移时,只需要判断最大值是否在滑动窗口中。所以说如果此时通过右移添加的元素是大于之前窗口中的最大值的,这种情况下此时while循环里面它的最大值就是当前元素,比较的下标也是当前元素的。所以就不要纠结为什么之前窗口最大的无法弹出了,因为它遇见了一个比它更大的,懂了吧。

下面的代码是我在pycharm编译器里面测试编写的,若要放在力扣上面的话记得改动一下。

代码:

import heapq
class Solution:
    def maxSlidingWindow(nums, k):
        n = len(nums)
        # 注意 Python 默认的优先队列是小根堆
        q = [(-nums[i], i) for i in range(k)]
        #这里的作用是将其调整成为一个大根堆,q本身就发生了改变,并返回none
        heapq.heapify(q)
        ans = [-q[0][0]]
        for i in range(k, n):
            heapq.heappush(q, (-nums[i], i))
            while q[0][1] <= i - k:
                print("此时的i,k,q[0][1]分别为",i,k,q[0][1])
                print("弹出的q值为:",q[0][0])
                #将q对列中弹出最小的元素
                heapq.heappop(q)
                print("弹出之后的q值",q)
            ans.append(-q[0][0])
            print("q2的值为", q)
        return ans
nums=[1,0,-1,-3,5,3,6,7]
nums1=[1]
k=3
m=Solution.maxSlidingWindow(nums,k)
print(m)

76.最小覆盖子串

思路

这道题目的意思是要寻找s中覆盖t的连续最短子串,那我们可以用一个字典need来存储各个元素出现的次数,以及用needCnt来标识此时滑动窗口中的元素是否全部包括t中的元素,再用元组res来存储各个满足条件的窗口中的长度的下标。用i和j分别代表窗口的左边界和右边界,然后右移窗口,直到needCnt==0停止,这就代表着窗口中的元素已经全部包括t了,这里需要判断此时的元素出现的次数是否大于0,是的话长度得减1,减一和加一的标准是j++时,--,i++时,++。具体的大家看代码应该就能看懂了。加油!!!

代码:

class Solution:
    def minWindow(self, s: str, t: str) -> str:
        # 1.创建一个字典,用以存储各个字母出现的次数
        need=collections.defaultdict(int)
        # 循环遍历t数组,统计次数存入need中
        for c in t:
            need[c]+=1
        # 更新needCnt的值,此时就是t数组的长度,当其能匹配到S中相应的字符时,便减一直到为0
        needCnt=len(t)
        # 代表左边窗口
        i=0
        # 定义元组的大小,右边表示正无穷
        res=(0,float('inf'))
        # 循环遍历s数组
        for j,c in enumerate(s):
            #当s中的字符对应在字典中的值大于0时,needCnt--,因为只要是在右移的过程中,碰到的元素都是--的
            if need[c]>0:
                needCnt-=1
            need[c]-=1
            #当窗口中的元素的所有值都包含了t中的元素值之后,便开始移动左边窗口了
            if needCnt==0:
                while True:
                    c=s[i]
                    # 直到移动的元素是t中的,即need[c]==0,这里不考虑其他元素有没有可能为0的情况,因为如果为0,那就已经不在滑动窗口中了,目标元素在原始情况下是+1的,从此便区分开了
                    if need[c]==0:
                        break
                    need[c]+=1
                    i+=1
                #直到遇到t中元素的边界,这里就需要存储一下窗口大小,便于后续取出,之后便再次移动左边界,寻找遍历最短的包括t数组的连续数组
                if j-i<res[1]-res[0]:
                    res=(i,j)
                need[s[i]]+=1
                needCnt+=1
                i+=1
        # 这里切片
        return '' if res[1]>len(s) else s[res[0]:res[1]+1]

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

无缝集成GORM与Go Web框架

探索GORM与流行的Go Web框架之间的和谐集成&#xff0c;以实现高效的数据管理 高效的数据管理是每个成功的Web应用程序的基础。GORM&#xff0c;多才多艺的Go对象关系映射库&#xff0c;与流行的Go Web框架非常搭配&#xff0c;提供了无缝集成&#xff0c;简化了数据交互。本指…

Git可视化界面的操作,SSH协议的以及IDEA集成Git

目录 一. Git可视化界面的操作 二. gitee的ssh key 2.1 SSH协议 2.2 ssh key 三. IDEA集成Git 3.1 分享项目 3.2 下载项目 一. Git可视化界面的操作 上一篇博客只用到了git的命令窗口&#xff0c;现在就来看看可视化窗口要怎么操作。 点击Git GUI Here GUI界面 在g…

【Git】git常用命令大全

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《Git》。&#x1f3af;&#x1f3af; &#x1f449…

afsim 下载链接

afsim是一个通用的建模框架&#xff0c;能够构建典型的虚拟威胁环境和相关模型。能够以可视化形式分析软件仿真结果&#xff0c;显示平台、路由、传感器区域等内容&#xff0c;能够基于事件生成图表&#xff0c;进行结果统计&#xff0c;能够按类型进行统计分析。 苦于网上没有…

【Git】Git分支与应用分支

一&#xff0c;Git分支 1.1 理解Git分支 在 Git 中&#xff0c;分支是指一个独立的代码线&#xff0c;并且可以在这个分支上添加、修改和删除文件&#xff0c;同时作为另一个独立的代码线存在。一个仓库可以有多个分支&#xff0c;不同的分支可以独立开发不同的功能&#xff0…

maven教程

1. Maven概述 1.1 Maven的功能 1、Maven 作为依赖管理工具 随着我们使用越来越多的框架&#xff0c;或者框架封装程度越来越高&#xff0c;项目中使用的jar包也越来越多。项目中&#xff0c;一个模块里面用到上百个jar包是非常正常的。jar包所属技术的官网通常是英文界面&am…

极智芯 | 存算一体 弯道超车的希望

欢迎关注我的公众号 [极智视界]&#xff0c;获取我的更多经验分享 大家好&#xff0c;我是极智视界&#xff0c;本文分享一下 存算一体 弯道超车的希望。 邀您加入我的知识星球「极智视界」&#xff0c;星球内有超多好玩的项目实战源码和资源下载&#xff0c;链接&#xff1a;…

【C++笔记】优先级队列priority_queue的模拟实现

【C笔记】优先级队列priority_queue的模拟实现 一、优先级队列的介绍与使用方式1.1、优先级队列介绍1.2、优先级队列的常见使用 二、优先级队列的模拟实现1.0、仿函数的介绍1.1、构造函数1.2、优先级队列的插入push1.3、优先级队列的删除(删除堆顶元素)1.4、获取堆顶元素1.5、判…

MATLAB仿真通信系统的眼图

eyediagram eyediagram(complex(used_i,used_q),1100)

【Java 进阶篇】Java 中 JQuery 对象和 JS 对象:区别与转换

在前端开发中&#xff0c;经常会涉及到 JavaScript&#xff08;JS&#xff09;和 jQuery 的使用。这两者都是前端开发中非常重要的工具&#xff0c;但它们之间存在一些区别。本文将详细介绍 Java 中的 JQuery 对象和 JS 对象的区别&#xff0c;并讨论它们之间的转换方法。 1. …

Amazon Aurora MySQL 与 Amazon Redshift 的 Zero ETL 集成已全面可用,一起轻松上手!

“数据是应用、流程和商业决策的核心。” 亚马逊云科技数据库、 数据分析和机器学习全球副总裁 Swami Sivasubramanian 如今&#xff0c;客户常用的数据传输模式是建立从 Amazon Aurora 到 Amazon Redshift 的数据管道。这些解决方案能够帮助客户获得新的见解&#xff0c;进而…

【C/C++笔试练习】内联函数、函数重载、调用构造函数的次数、赋值运算符重载、静态成员函数、析构函数、模板定义、最近公共祖先、求最大连续bit数

文章目录 C/C笔试练习选择部分&#xff08;1&#xff09;内联函数&#xff08;2&#xff09;函数重载&#xff08;3&#xff09;调用构造函数的次数&#xff08;4&#xff09;赋值运算符重载&#xff08;5&#xff09;静态成员函数&#xff08;6&#xff09;调用构造函数的次数…

微信小程序和H5之间互相跳转、互相传值

微信小程序和内嵌 H5 之间来回跳转&#xff0c;来回交互。 1 微信小程序跳转 H5 1.2. web-view 微信小程序官方提供了 web-view 组件来实现微信小程序跳转到 H5 页面&#xff0c;实现的方式也很简单&#xff0c;具体实现方式如下&#xff1a; 1、新建一个页面用来单独存放 we…

网页推理游戏

目录 python challenge &#xff08;0&#xff09; &#xff08;1&#xff09; &#xff08;2&#xff09; The Riddle &#xff08;1&#xff09; &#xff08;2&#xff09; &#xff08;3&#xff09; &#xff08;4&#xff09; Nazo &#xff08;1&#xff09;…

宋浩高等数学笔记(三)微分中值定理

首先是考研大纲包含的内容&#xff1a; 1.理解并会用罗尔(Rolle)定理、拉格朗日(Lagrange)中值定理和泰勒(Taylor)定理&#xff0c;了解并会用柯西(Cauchy)中值定理. 2.掌握用洛必达法则求未定式极限的方法. 3.理解函数的极值概念&#xff0c;掌握用导数判断函数的单调性和求函…

事务AOP

1事务&#xff1a; 事务是一组操作的集合&#xff0c;它是一个不可分割的工作单位。事务会把所有的操作作为一个整体&#xff0c;一起向数 据库提交或者是撤销操作请求。所以这组操作要么同时成功&#xff0c;要么同时失败。 1.1实现&#xff1a;Transactional注解 Transact…

基于SSM的网络书店商城

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

电脑想要微信多开——打开多个微信的必胜法宝!

一个不知名大学生&#xff0c;江湖人称菜狗 original author: Jacky Li Email : 3435673055qq.com Time of completion&#xff1a;2023.11.11 Last edited: 2023.11.11 导读&#xff1a;在生活当中经常遇到工作和生活相撞的事情&#xff0c;导致在处理私人的事情同时不得不处理…

分销cps外卖券电影票小程序开发

电影票外卖劵分销CPS小程序开发作 我们致力于为消费者提供优质、便捷的外卖服务。现在&#xff0c;我们推出全新的电影票外卖劵分销CPS小程序&#xff0c;以及更多具有深度和专业度的功能和服务&#xff0c;以满足消费者更高的生活服务需求。 首先&#xff0c;我们的分销模式…

服务日志性能调优,由log引出一系列的事故

只有被线上服务问题毒打过的人才明白日志有多重要&#xff01; 谁赞成&#xff0c;谁反对&#xff1f;如果你深有同感&#xff0c;那恭喜你是个社会人了&#xff1a;&#xff09; 日志对程序的重要性不言而喻&#xff0c;轻巧、简单、无需费脑&#xff0c;程序代码中随处可见…