LeetCode
未读引言滑动窗口是一种常用的算法技巧,特别适合处理数组或字符串的连续子序列问题。本文将深入探讨滑动窗口算法的基本概念、常见类型、应用场景以及在 LeetCode 上的实际应用。
1. 滑动窗口算法概述滑动窗口算法的核心思想是维护一个可变大小的”窗口”,通过同时移动这个窗口的左右边界,高效地遍历数组或字符串,从而在线性时间内解决一些复杂的子序列问题。
2. 滑动窗口的基本框架1234567891011121314151617181920212223def sliding_window(s): left = right = 0 window = {} # 用于存储窗口中的元素 result = 0 # 根据具体问题而定的结果变量 while right < len(s): # 扩大窗口 c = s[right] window[c] = window.get(c, 0) + 1 right += 1 # 根据条件收缩窗口 while window_needs ...
LeetCode
未读引言双指针是一种常用的算法技巧,在解决数组、链表、字符串等问题时非常有效。本文将深入探讨双指针算法的基本概念、常见类型、应用场景以及在 LeetCode 上的实际应用。
1. 双指针算法概述双指针算法involves using two pointers to solve a problem, usually to search for a pair of elements or to traverse the data structure. 这种技巧可以大大提高算法的效率,通常可以将时间复杂度从 O(n^2) 降低到 O(n)。
2. 双指针的常见类型2.1 对撞指针两个指针分别从数组的两端向中间移动。
应用场景:
有序数组的 Two Sum 问题
回文串判断
示例:有序数组的 Two Sum(LeetCode 167)
1234567891011def twoSum(numbers, target): left, right = 0, len(numbers) - 1 while left < right: current_sum = numbe ...
LeetCode
未读引言哈希表(Hash Table)是一种高效的数据结构,它通过键值对的方式存储数据,并利用哈希函数实现快速的查找、插入和删除操作。本文将深入探讨哈希表的原理、实现方法、应用场景以及相关的解题技巧。
1. 哈希表基本原理1.1 概念哈希表是一种基于数组的数据结构,它使用哈希函数将键映射到数组索引,从而实现快速访问。
1.2 哈希函数哈希函数是哈希表的核心,它将键转换为数组索引。一个好的哈希函数应该:
计算速度快
均匀分布
减少冲突
1.3 处理冲突当两个不同的键被哈希到同一个索引时,就会发生冲突。常见的解决方法有:
链地址法(Chaining)
开放寻址法(Open Addressing)
2. Python 中的哈希表实现Python 的字典(dict)就是一种哈希表实现。以下是一个简单的哈希表类实现:
123456789101112131415161718192021222324252627282930class HashTable: def __init__(self, size=100): self.size = size self.ta ...
LeetCode
未读引言栈和优先队列是两种重要的数据结构,在算法设计和问题解决中扮演着关键角色。本文将深入探讨这两种数据结构的概念、实现方法、应用场景以及相关的解题技巧。
1. 栈(Stack)1.1 基本概念栈是一种遵循后进先出(LIFO, Last-In-First-Out)原则的线性数据结构。主要操作包括:
push:将元素压入栈顶
pop:移除并返回栈顶元素
peek/top:返回栈顶元素但不移除
isEmpty:检查栈是否为空
1.2 Python 实现1234567891011121314151617181920class Stack: def __init__(self): self.items = [] def push(self, item): self.items.append(item) def pop(self): if not self.is_empty(): return self.items.pop() def peek(self): if not self.i ...
LeetCode
未读引言图是一种复杂而强大的数据结构,在计算机科学和现实世界中有着广泛的应用。本文将介绍图的基本概念、表示方法、常见算法以及解决图相关问题的技巧。
1. 图的基本概念图由顶点(节点)和边组成。根据边的性质,图可以分为:
无向图:边没有方向
有向图:边有特定方向
加权图:边有权重
2. 图的表示方法2.1 邻接矩阵使用二维数组表示图中节点之间的连接关系。
123456# 邻接矩阵表示graph = [ [0, 1, 0], [1, 0, 1], [0, 1, 0]]
2.2 邻接表使用字典或列表数组表示每个节点的邻接节点。
123456# 邻接表表示graph = { 0: [1], 1: [0, 2], 2: [1]}
3. 图的遍历3.1 深度优先搜索(DFS)12345678def dfs(graph, start, visited=None): if visited is None: visited = set() visited.add(start) print(start) fo ...
LeetCode
未读引言树是一种非常重要的数据结构,在计算机科学中有广泛的应用。本文将介绍树的基本概念、常见类型,以及解决树相关问题的常用技巧。
1. 树的基本概念树是由节点和边组成的数据结构,它具有以下特点:
有一个根节点
每个节点可以有零个或多个子节点
没有环路
最基本的树节点结构如下:
12345class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right
2. 常见的树类型2.1 二叉树每个节点最多有两个子节点的树。
2.2 二叉搜索树(BST)一种特殊的二叉树,其中每个节点的左子树中的值都小于该节点的值,右子树中的值都大于该节点的值。
2.3 平衡二叉树一种维持平衡的二叉搜索树,如 AVL 树和红黑树。
2.4 完全二叉树除了最后一层外,其他层都被完全填充,且最后一层的所有节点都尽可能地靠左。
2.5 满二叉树除了叶节点外,每个节点都有两个子节点的二叉树。
3. 树的遍历方 ...
LeetCode
未读引言链表是一种常见的数据结构,在面试和实际编程中经常遇到。本文将总结链表的常见操作和解题技巧,帮助你更好地应对链表相关的算法问题。
1. 链表的基本结构在开始之前,让我们先回顾一下链表的基本结构:
1234class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next
2. 常见链表操作2.1 遍历链表遍历是最基本的链表操作,也是许多其他操作的基础。
12345def traverse(head): current = head while current: print(current.val) current = current.next
2.2 插入节点在链表中插入节点需要注意更新相关节点的指针。
12345678910def insert(head, val, position): dummy = ListNode(0) dummy.next = head current = d ...
LeetCode
未读整体概述在LeetCode Hot 100题目中,我们可以看到各种常见的数据结构和算法问题。这些题目不仅涵盖了基础知识,还涉及到一些高级技巧和优化方法。
Hot 100题目的类型分布Hot 100题目主要分布在以下几类:
数组
链表
树
图
栈/队列
哈希表
字符串
动态规划
贪心算法
回溯算法
每一类题目都有其独特的解题思路和技巧,掌握这些类型的题目可以帮助我们更好地应对面试中的各种问题。
常见的解题模式和技巧在解LeetCode Hot 100题目时,我们可以总结出一些常见的解题模式和技巧:
双指针法:适用于数组和链表中的一些问题,如快慢指针、左右指针等。
滑动窗口:用于解决子数组或子串问题,常用于最大/最小子数组和问题。
二分查找:适用于有序数组或需要在特定范围内查找的情况。
动态规划:用于解决最优子结构问题,如最长子序列、背包问题等。
回溯算法:用于解决组合、排列、子集等问题,常用于深度优先搜索。
贪心算法:用于解决局部最优解能导出全局最优解的问题,如区间调度、最小生成树等。
通过练习这些解题模式和技巧,我们可以更高效地解决LeetCode Hot ...
LeetCode
未读引言在编程面试中,LeetCode Hot 100题目是最常被问到的题目之一。这些题目涵盖了各种常见的数据结构和算法,是准备技术面试的绝佳资源。
LeetCode Hot 100的重要性LeetCode Hot 100题目不仅能帮助你巩固基础知识,还能提升你的解题能力和编程技巧。通过练习这些题目,你可以更好地理解算法的核心思想,并在面试中自信地展示你的能力。
写作这个系列的目的写作这个系列博客的目的是为了记录和分享我在练习LeetCode Hot 100题目过程中的心得和技巧。希望这些总结能帮助到其他正在准备面试的朋友们,同时也为自己提供一个复习和回顾的机会。