Hot100刷题计划-Day2-滑动窗口、双指针、数组、链表、动态规划
- LeetCode Hot 100 是最常被考察的题目集合,涵盖了面试中常见的算法和数据结构问题。
- 刷 Hot100可以让你在有限的时间内集中精力解决最常考的问题。
- 不仅要写出代码,还要理解问题的本质、优化解法和复杂度分析。
滑动窗口
438. 找到字符串中所有字母异位词
给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词的子串,返回这些子串的起始索引。不考虑答案输出的顺序。s 和 p 仅包含小写字母。
思路: 哈希表+滑动窗口。把待匹配的字符串用数组哈希化,左右指针滑动,右指针纳入元素,判断是否合法,不合法则移动左指针直到合法。若窗口合法,且长度相等,符合条件。
class Solution:def findAnagrams(self, s: str, p: str) -> List[int]:ans = [] # 存放结果答案cnt = [0] * 26 # 小写字母,26个位置存放频率for i in p:cnt[ord(i)-ord('a')] += 1 # 待匹配的字符串字符频率left = 0for right in range(len(s)):cnt[ord(s[right])-ord('a')] -= 1 # 右指针位置元素纳入窗口while cnt[ord(s[right])-ord('a')] < 0: # 若有元素频率小于0,①不在待匹配字符串,②多次出现同一字符【都是有字符超了】cnt[ord(s[left])-ord('a')] += 1 # 将左指针对应的元素释放,频率还回去left += 1 # 左指针右移,左指针追右指针if right - left + 1 == len(p): # 如果长度相等,加上前面都不小于0,符合题意ans.append(left)return ans
209. 长度最小的子数组
给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其总和大于等于 target 的长度最小的 子数组[numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
思路: 依次纳入窗口,判断窗口中子数组是否满足target,因为要找最小长度,满足则移动左指针,更新最小长度。时间复杂度O(n),空间O(1).
class Solution:def minSubArrayLen(self, target: int, nums: List[int]) -> int:if sum(nums)<target: return 0 # 不存在符合条件的子数组total = 0slow = 0ans = float('inf')for fast in range(len(nums)): total += nums[fast] # 依次将元素纳入窗口while total >= target: # 找最小数组,满足条件移动左指针ans = min(ans, fast-slow+1) # 更新最小长度total -= nums[slow]slow += 1return ans
76. 最小覆盖子串
给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “” 。
注意:
对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。
如果 s 中存在这样的子串,我们保证它是唯一的答案。
思路: 记录每个字符需要个数和总个数,不断扩展右边界,直到覆盖全部子串。覆盖全部子串后,再不断缩小左边界,直到找到覆盖的最小区间(其中之一)。记录区间是否需要更新,再缩小一步左边界。
class Solution:def minWindow(self, s: str, t: str) -> str:need = Counter(t) # 统计下需要的数出现频率(更新可能出现负数)ans = (0, float('inf')) # 元组记录起始索引和长度needcnt = len(t) # 总需要的数left = 0for right in range(len(s)): # 用enumerate()写会好看,扩展窗口if need[s[right]] > 0: # 目标数,则总数减1needcnt -= 1need[s[right]] -= 1 # 字符记录到对应字典,减1if needcnt == 0: # 满足覆盖的子数组条件while True: # 试图移动左指针,缩小窗口if need[s[left]] == 0:breakneed[s[left]] += 1 # 不是目标数,则左移左指针left += 1if right - left < ans[1] - ans[0]: # 将所有非目标数移除,得到一个最小区间ans = (left, right) # 如果比之前记录的小,更新need[s[left]] += 1 # 移动左指针,同时将needcnt也加个1needcnt += 1left += 1return '' if ans[1]>len(s) else s[ans[0]: ans[1]+1] # 切片用法
链表
142. 环形链表Ⅱ
给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。
思路: 快指针2步,慢指针1步;快慢指针环中相遇,从相遇点到环入口,和从链表到环入口距离一样。时间复杂度O(n),空间O(1).
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = Noneclass Solution:def detectCycle(self, head: Optional[ListNode]) -> Optional[ListNode]:fast = slow = head # 使用快慢指针while fast and fast.next: # 确保下一个节点存在,否则无法访问其nextslow = slow.next # 慢指针每次走一步fast = fast.next.next # 快指针每次走两步if fast == slow: # 快指针在环中追到慢指针slow = head # 重置慢指针的位置while fast != slow:slow = slow.nextfast = fast.nextreturn slow # 慢指针再次移动的位置即为入环index
递归
78. 子集
思路: 回溯。每次进入回溯函数,先将当前集合加入结果,再遍历该层元素加入,递归回溯。主要起始位置需要变。
class Solution:def subsets(self, nums: List[int]) -> List[List[int]]:self.ans = [] # 存放结果self.backtracking(nums, 0, [])return self.ansdef backtracking(self, nums, startIndex, path):self.ans.append(path[:]) # 每次都想加入结果集for i in range(startIndex, len(nums)):path.append(nums[i]) # 往里新增该层的元素self.backtracking(nums, i+1, path) # 递归进入下一层path.pop()
回溯
17. 电话号码的字母组合
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
思路: 不同的按键是不同的层,作为参数传递。
class Solution:def letterCombinations(self, digits: str) -> List[str]:if not digits: return [] # 处理空字符串phone_map ={'2' : 'abc','3' : 'def','4' : 'ghi','5' : 'jkl','6' : 'mno','7' : 'pqrs','8' : 'tuv','9' : 'wxyz'}self.ans = []self.backtracking(phone_map, digits, 0, [])return self.ansdef backtracking(self, phone_map, digits, startIndex, path):if startIndex == len(digits):self.ans.append(''.join(path))return letters = phone_map[digits[startIndex]]for letter in letters: path.append(letter)self.backtracking(phone_map, digits, startIndex+1, path)path.pop()
39. 组合总和
给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。
candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。
对于给定的输入,保证和为 target 的不同组合数少于 150 个。
思路:
class Solution:def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:self.ans = []self.backtracking(candidates, target, [], 0)return self.ansdef backtracking(self, candidates, target, path, startIndex): if target == 0:self.ans.append(path[:])returnif target < 0:returnfor i in range(startIndex, len(candidates)): # 为了避免顺序不同元素相同的重复,还是按顺序选path.append(candidates[i])self.backtracking(candidates, target-candidates[i], path, i) # 可以被无限选取,所以用i不用i+1path.pop()
131. 分割回文串
给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。
思路: 如果是回文串,则加入path。path长度达到字符串长度,找到一种方案。
class Solution:def partition(self, s: str) -> List[List[str]]:self.ans = []self.backtracking(s, [], 0)return self.ansdef backtracking(self, s, path, startIndex):if startIndex >= len(s): # 超过长度则得到一种分割方法self.ans.append(path[:])returnfor i in range(startIndex, len(s)):if s[startIndex:i+1] == s[startIndex:i+1][::-1]: # 最佳实践,判断是回文串就写入path.append(s[startIndex:i+1])self.backtracking(s, path, i+1)path.pop()
相关文章:
Hot100刷题计划-Day2-滑动窗口、双指针、数组、链表、动态规划
LeetCode Hot 100 是最常被考察的题目集合,涵盖了面试中常见的算法和数据结构问题。刷 Hot100可以让你在有限的时间内集中精力解决最常考的问题。不仅要写出代码,还要理解问题的本质、优化解法和复杂度分析。 滑动窗口 438. 找到字符串中所有字母异位词…...

[react 3种方法] 获取ant组件ref用ts如何定义?
获取ant的轮播图组件, 我用ts如何定义? Strongly Type useRef with ElementRef | Total TypeScript import React, { ElementRef } from react; const lunboRef useRef<ElementRef<typeof Carousel>>(null); <Carousel autoplay ref{lunboRef}> 这样就…...

考前倒计时98天
2024年12月21日到2025年3月29日共有 98 天 一、计算机基础 思维分类特征强调学科代表理论思维(推理思维)推理和演绎推理数学实验思维(证实思维)观察和总结自然规律归纳物理学计算思维(构造思维)设计和构造…...

iterm2 focus时灰色蒙层出现的解决办法
问题描述: 当前我的iterm2版本是3.5.10,是我最近才更新的,然后就出现以下页面显示问题,如图所示: 我个人对终端、编辑器等使用存在洁癖,尤其是页面显示效果不满意更是不能忍受,之前找了很久没有…...
合并K个升序链表(最优解)
题目来源 23. 合并 K 个升序链表 - 力扣(LeetCode) 题目描述 给你一个链表数组,每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中,返回合并后的链表。 示例 1: 输入:lists [[1,4,5],[1,3,…...

kubernates实战
使用k8s来部署tomcat 1、创建一个部署,并指定镜像地址 kubectl create deployment tomcat6 --imagetomcat:6.0.53-jre82、查看部署pod状态 kubectl get pods # 获取default名称空间下的pods kubectl get pods --all-namespaces # 获取所有名称空间下的pods kubect…...
How to run Flutter on an Embedded Device
basysKom GmbH | How to run Flutter on an Embedded Device https://github.com/sony/flutter-embedded-linux/wiki/Building-Flutter-Engine-from-source flutter源码下载(最新)-CSDN博客 flutter_engine 交叉编译【自定义编译器(最新)】_flutter。engine 修改-CSDN博客 …...

airflow docker 安装
mkdir -p /root/airflow cd /root/airflow && mkdir -p ./dags ./logs ./plugins ./configcd /root/airflow/ wget https://airflow.apache.org/docs/apache-airflow/2.10.4/docker-compose.yaml nano docker-compose.yamlAIRFLOW__CORE__LOAD_EXAMPLES: false #初始化…...

浅析InnoDB引擎架构(已完结)
大家好,我是此林。 今天来介绍下InnoDB底层架构。 1. 磁盘架构 我们所有的数据库文件都保存在 /var/lib/mysql目录下。 由于我这边是docker部署的mysql,用如下命令查看mysql数据挂载。 docker inspect mysql-master 如下图,目前只有一个数…...

华为云计算HCIE笔记02
第二章:华为云Stack规划设计 交付总流程 准备工作:了解客户的基本现场,并且对客户的需求有基本的认知。 HLD方案BOQ报价设备采购和设备上架 2.安装部署流程 硬件架构设计 硬件设备选配 设备上架与初始化配置 准备相关资料(自动下载…...

鸿蒙项目云捐助第十讲鸿蒙App应用分类页面二级联动功能实现
鸿蒙项目云捐助第十讲鸿蒙App应用分类页面二级联动功能实现 在之前的教程中完成了分类页面的左右两侧的列表结构,如下图所示。 接下来需要实现左侧分类导航项的点击操作,可以友好的提示用户选择了哪一个文字分类导航项。 一、左侧文字分类导航的处理 …...

STM32低功耗模式结合看门狗
STM32低功耗模式结合看门狗 前言 最近做到一个需求要使用STM32的低功耗模式进行长时间待机应用,每隔十分钟发送一次数据到服务器上,当不发送的时候就处于低功耗模式。在经过一段时间的测试以后发现板子过三四天左右就没有数据上传服务器了,…...

数据迁移工具,用这8种!
前言 最近有些小伙伴问我,ETL数据迁移工具该用哪些。 ETL(是Extract-Transform-Load的缩写,即数据抽取、转换、装载的过程),对于企业应用来说,我们经常会遇到各种数据的处理、转换、迁移的场景。 今天特地给大家汇总了一些目前…...

Sapro编程软件
Sapro软件是由西门子建筑科技公司开发的一款编程软件,主要用于Climatix控制器的编程、调试及相关功能实现.以下是其具体介绍: • 功能强大:可进行HVAC控制编程,实现设备控制、HMI用户访问和设备集成等功能,满足复杂的…...

Python图注意力神经网络GAT与蛋白质相互作用数据模型构建、可视化及熵直方图分析...
全文链接:https://tecdat.cn/?p38617 本文聚焦于图注意力网络GAT在蛋白质 - 蛋白质相互作用数据集中的应用。首先介绍了研究背景与目的,阐述了相关概念如归纳设置与转导设置的差异。接着详细描述了数据加载与可视化的过程,包括代码实现与分析…...

2024年图像处理、多媒体技术与机器学习
重要信息 官网:www.ipmml.org 时间:2024年12月27-29日 地点:中国-大理 简介 2024年图像处理、多媒体技术与机器学习(CIPMT 2024)将于2024年12月27-29日于中国大理召开。将围绕图像处理与多媒体技术、机器学习等在…...

java 1.8+springboot文件上传+vue3+ts+antdv
1.参考 使用SpringBoot优雅的实现文件上传_51CTO博客_springboot 上传文件 2.postman测试 报错 :postman调用时body参数中没有file单词 Resolved [org.springframework.web.multipart.support.MissingServletRequestPartException: Required request part file is…...
【机器人】机械臂轨迹和转矩控制对比
动力学控制和轨迹跟踪控制是机器人控制中的两个概念,它们在目标、方法和应用上有所不同,但也有一定关联。以下是它们的区别和联系: 1. 动力学控制 动力学控制是基于机器人动力学模型的控制方法,目标是控制机器人关节力矩或力&…...
如何利用矩阵化简平面上的二次型曲线
二次型曲线的定义 在二维欧式平面上,一个二次型曲线都可以写成一个关于 x , y x,y x,y的二元二次多项式: F ( x , y ) a 11 x 2 2 a 12 x y a 22 y 2 2 a 1 x 2 a 2 y a 0 0 \begin{equation} F(x,y)a_{11}x^22a_{12}xya_{22}y^22a_1x2a_2ya_00…...

【系统移植】制作SD卡启动——将uboot烧写到SD卡
在开发板上启动Linux内核,一般有两种方法,一种是从EMMC启动,还有一种就是从SD卡启动,不断哪种启动方法,当开发板上电之后,首先运行的是uboot。 制作SD卡启动,首先要将uboot烧写到SD卡ÿ…...

XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...

Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...

基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)
引言 工欲善其事,必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后,我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集,就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...

stm32wle5 lpuart DMA数据不接收
配置波特率9600时,需要使用外部低速晶振...

ubuntu系统文件误删(/lib/x86_64-linux-gnu/libc.so.6)修复方案 [成功解决]
报错信息:libc.so.6: cannot open shared object file: No such file or directory: #ls, ln, sudo...命令都不能用 error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory重启后报错信息&…...