快慢指针
快慢指针 基本概念 快慢指针:指两个指针从同一侧出发,步长不同,快指针(fast)移动更快,慢指针(slow)移动较慢。它们以不同速度遍历序列,直到快指针到达末尾、两指针相遇或满足特定条件时停止。 求解步骤 初始化:slow=0,fast=1 循环移动指针:根据特定条件,移动指针 结束循环:fast到达数组末尾两指针相遇或满足特定条件 通用模板: 12345678#1. 初始化:slow=0,fast=1slow,fast=0,1#2. 循环移动指针:根据特定条件,移动指针while fast<len(nums): if 满足条件: slow+=1 fast+=1return 最终结果 应用场景: 快慢指针主要用于解决数组元素的移动、删除等问题,以及链表中的环检测、长度统计等操作 27.移除元素 80.删除有序数组中的重复项 II
可变长度滑动窗口
固定长度滑动窗口 基本概念 不定长滑动窗口(Sliding Window):在数组 / 字符串上用两个指针动态维护一个可变长度的窗口,通过左右移动指针灵活调整窗口范围,实时维护最优解。 算法步骤 步骤如下 定义两个指针left和right,初始都指向序列起始位置(left=0,right=0),区间[left,right][left,right][left,right]表示当前窗口 不断右移right,将元素加入 窗口(如window.append(nums[right]))(如window.append(nums[right]))(如window.append(nums[right])) 当窗口不满足条件时,不断移除,缩小窗口 重复上述过程,直到right 遍历完整个数组 内部实现: 123456789101112#1. 定义两个指针left和right,初始都指向序列起始位置(left=0,right=0),区间$[left,right]$表示当前窗口left,right=0,0#2. 不断右移right,将元素加入 窗口(window.append(nums[r...
基数排序
基数排序 基本概念 基数排序(Radix Sort)基本思想: 按照数字的每一位进行排序,从最低位到最高位,逐位比较。 算法步骤 确定最大位数:遍历数组,找出最大值的位数 从最低位开始,到最高位为止,逐位对每一位排序: 创建10个桶(0-9) 按照每个元素当前位上的数字,将元素放入对应桶中 清空原始数组,然后按照桶的顺序依次取出对应元素,重新加入到数组中 内部实现: python 12345678910111213141516171819class Solution: def radixSort(self,nums:[int])->[int]: # 步骤1找出最大位数 size=len(str(max(nums))) # 步骤2 从最低位开始逐位排序 for i in range(size): # 步骤2.1 创建10个桶 buckets=[[]for _ in range(10)] # 步骤2.2 按照每个元素当前位数字,将元素放入对应桶中 for num in nums: buckets[num//(10**i)%10].a...
固定长度滑动窗口
固定长度滑动窗口 基本概念 固定长度滑动窗口算法(Fixed Length Sliding Window):在数组 / 字符串上维护一个长度固定的窗口,通过不断向右滑动窗口,实时更新窗口内的数据,并根据题目要求动态维护最优解。 算法步骤 假设窗口大小为window_size,步骤如下 定义两个指针left和right,初始都指向序列起始位置(left=0,right=0),区间[left,right][left,right][left,right]表示当前窗口 不断右移right,将元素加入 窗口(如window.append(nums[right]))(如window.append(nums[right]))(如window.append(nums[right])) 当窗口长度达到window_size(right-left+1>=window_size)时: 判断窗口内元素是否满足题目要求,如果满足,更新答案 右移left,保持窗口长度不变 重复上述过程,直到right 遍历完整个数组 内部实现: 123456789101112131415#1. 定义...
分离双指针
分离双指针 基本概念 分离双指针:指的是分别在两个不同数组上各设置一个指针,两个指针独立地在各自数组中移动,以协同完成特定任务。 求解步骤 定义两个指针 left_1l 和 left_2,分别指向两个数组的起始位置(均为 0)。 根据条件,如果需要,两个指针同时右移:left_1+=1,left_2+=1。 如果只需移动第一个数组指针,则 left_1+=1。 如果只需移动第二个数组指针,则 left_2+=1。 当任一指针遍历到数组末尾或满足终止条件时,结束循环。 通用模板: 123456789101112131415#1. 定义两个指针 left_1l 和 left_2,分别指向两个数组的起始位置(均为 0)。left_1,left_2=0,0while left_1<len(nums1) and left_2<len(nums2)#2. 根据条件,如果需要,两个指针同时右移:left_1+=1,left_2+=1。 if : left_1+=1 left_2+=1#3. 如果只需移动第一个数组指针,则 left_1+=1。 elif : ...
二分查找
二分查找 基本概念 二分查找算法(Binary Search Algorithm),又称折半查找或对数查找,是一种在有序数组中高效定位目标元素的方法。其核心思想是每次将查找区间缩小一半,从而快速锁定目标位置。 算法步骤 初始化:确定待查找的数据集合为有序数据 设置查找区间:定义查找的左右边界,初始时left指向数组起始位置,right指向数组末尾位置 计算中间下标:通过mid=(left+right)/2mid=(left+right)/2mid=(left+right)/2计算当前查找区间的中间下标mid 比较并缩小区间: 如果target==nums[mid]target==nums[mid]target==nums[mid],则找到目标,返回mid 如果target<nums[mid]target<nums[mid]target<nums[mid],目标在左半区间,更新右边界right=mid-1 如果target>nums[mid]target>nums[mid]target>nums[mid],目标在右半区间,更新左边界...
对撞指针
对撞指针 基本概念 对撞指针:即用两个指针left 和 right,分别指向序列的首尾,left向右,right向左移动,直到两指针相遇(left==rightleft==rightleft==right)或满足特定条件 求解步骤 初始化:left=0,right=len(nums)-1 循环移动指针:根据特定条件,移动指针 结束循环:两指针相遇或满足特定条件 通用模板: 1234567891011#1. 初始化:left=0,right=len(nums)-1left,right=0,len(nums)-1#2. 循环移动指针:根据特定条件,移动指针while left<right: if 满足条件: return elif 满足条件1: left+=1 elif 满足条件2: right-=1return 没找到 应用场景: 对撞指针常用于有序数组或字符串,典型应用包括: 查找有序数组中特定元素组合,如二分查找、两数之和等。 字符串或数组反转,如反转字符串、判断回文、颠倒二进制等。 344.反转字符串 345.反转字符串中的元音字母...
2026年12周每周总结
📊 第12周总结 一、核心数据统计 维度 本周数据 上周对比 备注 专注时长(小时) 约12小时 ↑ 代码提交次数 20+次(对应LeetCode题解) ↑ 论文/书籍阅读 无 – 运动次数 – 日记完成天数 5天 二、重点项目复盘 1. 算法学习/项目 完成数据结构与算法专题整理,涉及: 二分查找(含猜数字大小、搜索插入位置等3个实战) 双指针(对撞、快慢、分离三类型,配套5个LeetCode题) 滑动窗口(固定长度、可变长度,配套3个实战) 栈与队列(单调栈、栈模拟、队列实现栈等6个实战) 基数排序(数组拆分中应用) 所有题解均按统一模板撰写,包含问题描述、解题思路、代码实现、性能分析、思考,结构清晰。 对指针类、滑动窗口、栈等核心数据结构建立了独立的笔记文件(如《对撞指针.md》《可变长度滑动窗口.md》),形成了可复用的知识库。 关键突破: 首次系统梳理了双指针三种模式(对撞、快慢、分离),并配套实战,形成体系化认知。 栈专题中完成了逆波兰表达式、基本计算器II、字...
用队列实现栈-LeetCode
用队列实现栈 🎯 问题描述(来源于LeetCode) 描述: 请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。 实现 MyStack 类: void push(int x) 将元素 x 压入栈顶。 int pop() 移除并返回栈顶元素。 int top() 返回栈顶元素。 boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。 说明: 示例: 示例 1: 12345678910111213输入:["MyStack", "push", "push", "top", "pop", "empty"][[], [1], [2], [], [], []]输出:[null, null, null, 2, 2, false]解释:MyStack myStack = new MyStack();myStack.push(1);mySt...
设计循环队列-LeetCode
设计循环队列 🎯 问题描述(来源于LeetCode) 描述: 设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。 循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。 你的实现应该支持如下操作: MyCircularQueue(k): 构造器,设置队列长度为 k 。 Front: 从队首获取元素。如果队列为空,返回 -1 。 Rear: 获取队尾元素。如果队列为空,返回 -1 。 enQueue(value): 向循环队列插入一个元素。如果成功插入则返回真。 deQueue(): 从循环队列中删除一个元素。如果成功删除则返回真。 isEmpty(): 检查循环队列是否为空。 isFull(): 检查循环队列是否已满。 说明: 所有的值都在 0 至 1000 的范围内; 操作数将在 1 至 100...












