LeetCode 热题 100 Day02

滑动窗口模块

滑动窗口类问题:总能找到一个窗口,从前往后移动来查找结果值。

这个窗口的大小可能是固定的,也可能是变化的。但窗口的大小一定是有限的。

https://www.cnblogs.com/huansky/p/13488234.html

Leetcode 3. 无重复字符的最长子串

题意理解:

        给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。

        我们采用滑动窗口来解决这道问题,其中:滑动窗口用来查找不重复子串。

解题思路:

        找到一个位置i,开始扩展滑动窗口,len++,当出现重复元素时,记录不重复子串长度,i位置向后移一位。

1.滑动窗口解题

public int lengthOfLongestSubstring(String s) {int maxLen=0;HashSet<Character> set=new HashSet<>();for(int i=0;i<s.length();i++){int j=i;while(j<s.length()&&(!set.contains(s.charAt(j)))){set.add(s.charAt(j));j++;}maxLen=Math.max(maxLen,set.size());set=new HashSet<>();}return maxLen;}

2.复杂度分析

时间复杂度:O(n^2),遍历元素和遍历滑动窗口的时间耗费

空间复杂度:O(n), 所有set的空间损耗。

Leetcode 438. 找到字符串中所有字母异位词

题意理解

        给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。

        

        给定一个目标字符串p,在字符串s中寻找其异位词的位置下标。

        则s中存在和p相同长度的子串,且子串的组成相同,返回该子串的位置即可。

        此处采用滑动窗口来解题。

解题思路

        采用滑动窗口解题,其中窗口大小等于p的长度

        将窗口从0下标开始向后移动,每次取窗口里的子串进行判断        

        窗口子串是否是p的异位词

        是怎将窗口位置下标加入结果集,否则不加入

        将窗口继续向后移动。

1.滑动窗口解题

    public List<Integer> findAnagrams(String s, String p) {List<Integer> result=new ArrayList<>();int window=p.length();for(int i=0;i<s.length()-window+1;i++){String str=s.substring(i,i+window);if(isAllotopicWord(str,p)){result.add(i);}}return  result;}public boolean isAllotopicWord(String str,String target){int[] letter=new int[26];for(int i=0;i<str.length();i++)letter[str.charAt(i)-'a']+=1;for(int i=0;i<target.length();i++)letter[target.charAt(i)-'a']-=1;for(int i=0;i<letter.length;i++)if(letter[i]!=0) return false;return true;}

2.复杂度分析

时间复杂度:O(n^2)

空间复杂度:O(n)

子串模块

子串:

子串类题目通常解决方法有:滑动窗口、双指针等

特别要注意一些边界判断,容易出错

再就是如何优化时间|空间复杂度。

Leetcode 560. 和为 K 的子数组

题意理解:

        给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。子数组是数组中元素的连续非空序列。

        查找有多少个连续的子序列和为k。是子串遍历的一类问题。

解题思路:

        遍历所有的连续子串,若子串长度==k,则result++

        特别的注意:

        当子串和大于k时,不代表遍历停止,后续的负数可能使其仍然满足一个子串。

        如:1,-1,0

        k=0

        则满足规则的子串有: 1,-1          1,-1,0           0

1.子串遍历解题

public int subarraySum(int[] nums, int k) {int result=0;for(int i=0;i<nums.length;i++){int sum=0;for(int j=i;j<nums.length;j++){sum+=nums[j];if(sum==k) result++;}}return  result;}

2.复杂度分析

时间复杂度:O(n^2)

空间复杂度:O(1)

Leetcode 239. 滑动窗口最大值

题意理解:  

        给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回 滑动窗口中的最大值 

解题思路:

        选中一个1起始位置,如0, 则获得第一个滑动窗口: 1,3 ,-1   此时max=3

        向下滑动一个位置,此时要有一个数加入,一个数被丢弃

        使用队列来维持窗口中的最大值。使最大值总是出现在队列尾端。

        比最大值小的值维护在,队首。

这道题目的难点在于:最大的数被移出窗口后,如何从剩下的值中获得最大值

还一个点:(关键)

  1.  k个数的数列,其中包含最大值x,则x以前的数是没有意义的:
  2. 因为只要能取到x, 一定不会取到x之前的数,因为x最为max,一定比前面的值大
  3. 除此之外:
  4. 新进入的值y:  y前面比它小的值也是没有意义的,若y比x大,则y前面所有的值都是没有意义的废数。

这样的解法本质上是将滑动窗口里的值维护到了一个单调队列里,他总是保持最大值及到当前位置的比它小的值,最大值前面且比它小的数是废数。

1.滑动窗口解题

class Solution {public int[] maxSlidingWindow(int[] nums, int k) {if(nums.length==1||k==1){return nums;}Deque<Integer> queue=new LinkedList<>();List<Integer> numbers=new ArrayList<>();for(int i=0;i<nums.length;i++){//弹出过期数据if((!queue.isEmpty())&&queue.peekFirst()==i-k){queue.pollFirst();}//前面比它大if(queue.isEmpty()){queue.offerLast(i);} else if(nums[queue.peekLast()]>nums[i]) {queue.offerLast(i);}else if(nums[queue.peekLast()]<=nums[i]){//前面比它小,全部弹出while((!queue.isEmpty())&&nums[queue.peekLast()]<=nums[i]){queue.pollLast();}queue.offerLast(i);}if(i>=k-1){numbers.add(queue.peekFirst());}}int[] result=new int[numbers.size()];for(int i=0;i<numbers.size();i++){result[i]=nums[numbers.get(i)];}return result;}
}

2.复杂度分析

时间复杂度:O(n)

空间复杂度:O(n)

Leetcode 76. 最小覆盖子串

题意理解:

        给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" 。

注意:

  • 对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。

如果 s 中存在这样的子串,我们保证它是唯一的答案

        及返回s中包含t所有元素的最短子串。此处还是可以用双指针来解决这道题目。

解题思路:

        1.找到一个左指针开头: 即一个t中的元素开头。

        2.找到一个右指针结尾: 即一个t中的元素结尾,且当前滑动窗口包含t中所有元素。

        3.将结果维护在result串中

        4.左指针向右移动,弹出左侧元素,直到左侧开始第一个t中元素

        5.右指针扩展,右边找滑动窗口的结尾。

        6.重复步骤3

一个要注意的点:如何判断s包含t所有元素呢?t中可能有重复元素

比较两个方面:是否右t中元素,s中的对应t中的元素个数要多于或等于t中对应元素的个数

如:s: abcab     t:aab   s中a的个数>=t中a的个数,才能满足条件:s包含t所有元素

上述方法没问题,但是会发生超时问题:优化

还是left和right两个指针

1.right向右拓展,left向right靠近,最终获得最短符合条件的子串

2.用sMap和tMap来维护子串和t串的元素及个数

3.判断tMap所有key满足:sMap.get(c)>tMap.get(c),则[left,right]子串满足要求

4.将结果子串用ansL和ansR维护,其中表示子串的最左位置和最右位置

5.最后返回[ansL,ansR]子串

优化了哪里:

        sMap由right和left实时维护,不用每次在对[left,right]统计,少了一层for循环

        时间复杂度优化了

1.双指针解题

class Solution {public String minWindow(String s, String t) {int ansL=0,ansR=-1;//保存t中元素及个数|sMap<Character,Integer> tMap=new HashMap<>();Map<Character,Integer> sMap=new HashMap<>();for(char c:t.toCharArray()){tMap.put(c,tMap.getOrDefault(c,0)+1);}int left=0,right=0;while(right<s.length()){if(tMap.containsKey(s.charAt(right)))sMap.put(s.charAt(right),sMap.getOrDefault(s.charAt(right),0)+1);while(left<=right&&isContains(sMap,tMap)){//right向右移动,left向right缩,最后获得最短子串if(ansR==-1||right-left<ansR-ansL) {ansL=left;ansR=right;}if(tMap.containsKey(s.charAt(left))){sMap.put(s.charAt(left),sMap.getOrDefault(s.charAt(left),0)-1);}left++;}right++;}return ansR-ansL+1<=0?"":s.substring(ansL,ansR+1);}//判断public boolean isContains(Map<Character,Integer> sMap,Map<Character,Integer> tMap){for(char key:tMap.keySet()){if(tMap.get(key)>sMap.getOrDefault(key,0)) return false;}return true;}
}

2.复杂度分析

时间复杂度:O(n^2)

空间复杂度:O(n)

这道题是一道困难题:难在容易超时。如何对代码优化。

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

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

相关文章

图书馆自习室|基于SSM的图书馆自习室座位预约小程序设计与实现(源码+数据库+文档)

图书馆自习室目录 基于SSM的图书馆自习室座位预约小程序设计与实现 一、前言 二、系统设计 三、系统功能设计 1、小程序端&#xff1a; 2、后台 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a…

专业照片编辑软件ON1 Photo RAW 2024 mac/win

ON1 Photo RAW 2024 for Mac是一款集专业性与易用性于一体的照片编辑软件。它拥有简洁直观的用户界面&#xff0c;即便对于摄影新手&#xff0c;也能快速上手。软件支持RAW格式照片处理&#xff0c;能够完整保留照片原始信息&#xff0c;让后期调整更加灵活。 在功能方面&#…

视力筛查通知短信群发选择106平台时应注意什么!

选择106平台进行视力筛查通知短信群发时&#xff0c;需要注意以下几点&#xff1a; 1.平台的合规性与资质&#xff1a;首先&#xff0c;确保所选的106短信平台具有合法的运营资质和工信审批相关证书。避免与违法平台合作&#xff0c;确保服务的合规性。 2.平台的覆盖范围与到…

第07-2章 TCP/IP模型

7.7 TCP/IP模型详解 7.7.1 简介 应用层的PDU>APDU&#xff08;Application PDU&#xff09; 表示层的PDU>PPDU&#xff08;Presentation PDU&#xff09; 会话层的PDU>SPDU&#xff08;Session PDU&#xff09; 7.7.2 TCP/IP协议体系 &#xff08;1&#xff09;TCP…

解析数据科学,探索ChatGPT背后的奥秘

在当今这个由数据驱动和AI蓬勃发展的时代&#xff0c;数据科学作为一门融合多种学科的综合性领域&#xff0c;对于推动各行各业实现数字化转型升级起着至关重要的作用。近年来&#xff0c;大语言模型技术发展态势强劲&#xff0c;为数据科学的进步做出了巨大贡献。其中&#xf…

OpenWrt 多拨负载均衡不起作用

检查 负载均衡->规则->Https->粘滞模式 是否启动&#xff0c;设置为 否 如果设置为是&#xff0c;那么根据官方描述&#xff1a; 来自相同源 IP 的流量&#xff0c;如果已经匹配过此规则并且在粘滞超时时间内&#xff0c;将会使用相同的 WAN 接口 意思就是如果你同一个…

NL2SQL进阶系列(4):ConvAI、DIN-SQL、C3-浙大、DAIL-SQL-阿里等16个业界开源应用实践详解[Text2SQL]

NL2SQL进阶系列(4)&#xff1a;ConvAI、DIN-SQL等16个业界开源应用实践详解[Text2SQL] NL2SQL基础系列(1)&#xff1a;业界顶尖排行榜、权威测评数据集及LLM大模型&#xff08;Spider vs BIRD&#xff09;全面对比优劣分析[Text2SQL、Text2DSL] NL2SQL基础系列(2)&#xff1a…

Redis中的订阅发布(二)

订阅与发布 订阅频道 每当客户端执行SUBSCRIBE命令订阅某个或某些频道的时候&#xff0c;服务器都会将客户端与被订阅的频道 在pubsub_channels字典中进行关联。 根据频道是否已经有其他订阅者&#xff0c;关联操作分为两种情况执行: 1.如果频道已经有其他订阅者&#xff0c…

2023年图灵奖揭晓,你怎么看?

阿维威格德森 (Avi Wigderson)是一位杰出的学者&#xff0c;他在理论计算机科学领域的贡献和研究成果备受认可。他对于理解计算中的随机性和伪随机性的作用所做出的开创性贡献将深远影响该领域的发展。这项荣誉是对他杰出成就的高度认可&#xff0c;也将激励更多人在理论计算机…

一文掌握 React 开发中的 JavaScript 基础知识

前端开发中JavaScript是基石。在 React 开发中掌握掌握基础的 JavaScript 方法将有助于编写出更加高效、可维护的 React 应用程序。 在 React 开发中使用 ES6 语法可以带来更简洁、可读性更强、功能更丰富,以及更好性能和社区支持等诸多好处。这有助于提高开发效率,并构建出更…

关于Wordpress的操作问题1:如何点击菜单跳转新窗口

1.如果打开&#xff0c;外观-菜单-菜单结构内&#xff0c;没有打开新窗口属性&#xff0c;如图&#xff1a; 2.在页面的最上部&#xff0c;点开【显示选项】&#xff0c;没有这一步&#xff0c;不会出现新跳转窗口属性 3.回到菜单结构部分&#xff0c;就出现了

php单文件实现文件批量预览——图片,音频,视频

有一天&#xff0c;无意中发现了一个在线文件预览地址。即那种暴露目录的地址。该目录下清一色的图片。觉得一个个点击进去查看太麻烦了&#xff0c;因此特意写了这个文件预览代码。单php文件&#xff0c;放到站点下运行即可。 1.实用场景 比如一个在线站点文件目录如下&#…

冯诺依曼结构理解

冯诺依曼结构 存储器&#xff1a;内存 数据是要在计算机的体系结构中进行流动的&#xff0c;在流动过程中对数据加工处理 从一个设备到另一个设备&#xff0c;本质是一种拷贝 CPU的计算速度是很快的&#xff0c;所以数据设备间的拷贝效率&#xff0c;决定了计算机整体的基本效率…

Excel 记录单 快速录入数据

一. 调出记录单 ⏹记录单功能默认是隐藏的&#xff0c;通过如下如图所示的方式&#xff0c;将记录单功能显示出来。 二. 录入数据 ⏹先在表格中录入一行数据&#xff0c;给记录单一个参考 ⏹将光标至于表格右上角&#xff0c;然后点击记录单按钮&#xff0c;调出记录单 然后点…

Go微服务: 服务熔断hystrix原理

微服务熔断概述 go 微服务保稳三剑客: 熔断&#xff0c;限流&#xff0c;负载均衡微服务熔断(hystrix-go) 与 服务雪崩效应 在服务里面&#xff0c;有服务A调用服务B, 会有依赖调用关系&#xff0c;同时服务C被B依赖如果依赖关系在生产环境中多的话&#xff0c;C挂了之后服务B原…

ins视频批量下载,instagram批量爬取视频信息

简介 Instagram 是目前最热门的社交媒体平台之一,拥有大量优质的视频内容。但是要逐一下载这些视频往往非常耗时。在这篇文章中,我们将介绍如何使用 Python 编写一个脚本,来实现 Instagram 视频的批量下载和信息爬取。 我们使用selenium获取目标用户的 HTML 源代码,并将其保存…

pyskl手势/动作识别的实现与pytorch cuda环境部署保姆教程

恭喜你&#xff0c;找到这篇不需要翻墙就能够成功部署的方法。在国内布置这个挺麻烦的&#xff0c;其他帖子会出现各种问题不能完全贯通。便宜你了。。 实话5年前我用1080训练过一个基于卷积和ltsm的手势识别&#xff0c;实话实说感觉比现在效果好。是因为现在的注意力都在tra…

贝叶斯网络

贝叶斯网络&#xff0c;又称为贝叶斯信念网络或贝叶斯网络模型&#xff0c;是一种概率图模型&#xff0c;由代表变量节点及连接这些节点的有向边构成。这种网络模型由Judea Pearl于1985年首次提出&#xff0c;用于表示和分析变量之间概率关系&#xff0c;从而进行不确定性推理。…

参会记录|全国多媒体取证暨第三届多媒体智能安全学术研讨会(MAS‘2024)

前言&#xff1a;2024年4月13日上午&#xff0c;我与实验室的诸位伙伴共聚江西南昌的玉泉岛大酒店&#xff0c;参加了为期一天半的全国多媒体取证暨第三届多媒体智能安全学术研讨会&#xff08;MAS’2024&#xff09;。本届学术研讨会由江西省计算机学会、江西省数字经济学会主…

自然语言处理: 第二十七章LLM训练超参数

前言: LLM微调的超参大致有如下内容,在本文中&#xff0c;我们针对这些参数进行解释 training_arguments TrainingArguments(output_dir"./results",per_device_train_batch_size4,per_device_eval_batch_size4,gradient_accumulation_steps2,optim"adamw_8bi…