数据结构与算法
# 数据结构与算法
# 📋 学习目标
- 掌握基本数据结构的实现原理
- 理解算法的时间和空间复杂度
- 能够选择合适的数据结构解决问题
- 熟练实现常用算法
# 🏗️ 数据结构分类
# 线性结构
# 数组 (Array)
- 特点:连续内存,随机访问O(1)
- 应用:排序、查找、动态规划
- 经典题目:
- 两数之和
- 最大子数组和
- 旋转数组
# 链表 (Linked List)
- 特点:动态内存,插入删除O(1)
- 应用:LRU缓存、图的邻接表
- 经典题目:
- 反转链表
- 合并两个有序链表
- 环形链表检测
# 栈 (Stack)
- 特点:后进先出(LIFO)
- 应用:表达式求值、函数调用
- 经典题目:
- 有效的括号
- 最小栈
- 逆波兰表达式
# 队列 (Queue)
- 特点:先进先出(FIFO)
- 应用:BFS、任务调度
- 经典题目:
- 用栈实现队列
- 滑动窗口最大值
- 二叉树层序遍历
# 树形结构
# 二叉树 (Binary Tree)
- 遍历方式:前序、中序、后序、层序
- 应用:表达式树、决策树
- 经典题目:
- 二叉树的最大深度
- 对称二叉树
- 路径总和
# 二叉搜索树 (BST)
- 特点:左子树 < 根 < 右子树
- 应用:快速查找、范围查询
- 经典题目:
- 验证二叉搜索树
- 二叉搜索树的最近公共祖先
- 将有序数组转换为BST
# 堆 (Heap)
- 特点:完全二叉树,父节点大于/小于子节点
- 应用:优先队列、堆排序
- 经典题目:
- 数组中的第K个最大元素
- 合并K个排序链表
- 前K个高频元素
# 图结构
# 图的表示
- 邻接矩阵:适合稠密图
- 邻接表:适合稀疏图
# 图的遍历
- 深度优先搜索(DFS):递归或栈实现
- 广度优先搜索(BFS):队列实现
# 经典算法
- 最短路径:Dijkstra、Floyd-Warshall
- 最小生成树:Kruskal、Prim
- 拓扑排序:Kahn算法、DFS
# 🎯 经典题目详解
# 1. 两数之和 🟢
题目:给定一个整数数组和目标值,找出数组中和为目标值的两个数的索引。
解法:哈希表
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
int complement = target - nums[i];
if (map.containsKey(complement)) {
return new int[]{map.get(complement), i};
}
map.put(nums[i], i);
}
return new int[]{};
}
时间复杂度:O(n) 空间复杂度:O(n)
# 2. 反转链表 🟡
题目:反转一个单链表。
解法:迭代
public ListNode reverseList(ListNode head) {
ListNode prev = null;
ListNode curr = head;
while (curr != null) {
ListNode next = curr.next;
curr.next = prev;
prev = curr;
curr = next;
}
return prev;
}
时间复杂度:O(n) 空间复杂度:O(1)
# 3. 二叉树的最大深度 🟢
题目:给定一个二叉树,找出其最大深度。
解法:递归
public int maxDepth(TreeNode root) {
if (root == null) {
return 0;
}
int leftDepth = maxDepth(root.left);
int rightDepth = maxDepth(root.right);
return Math.max(leftDepth, rightDepth) + 1;
}
时间复杂度:O(n) 空间复杂度:O(h),h为树的高度
# 💡 解题技巧
# 数组相关
- 双指针技巧:左右指针、快慢指针
- 滑动窗口:固定/可变窗口大小
- 前缀和:快速计算区间和
# 链表相关
- 虚拟头节点:简化边界处理
- 快慢指针:检测环、找中点
- 递归思维:分解子问题
# 树相关
- 递归模板:明确递归函数定义
- 层序遍历:使用队列BFS
- 路径问题:回溯算法
# 图相关
- DFS模板:递归或栈实现
- BFS模板:队列实现
- 状态压缩:位运算优化
# 📚 推荐资源
# 书籍
- 《算法导论》- 理论基础
- 《数据结构与算法分析》- 实现细节
- 《剑指Offer》- 面试必备
# 在线平台
- LeetCode - 题目丰富
- 牛客网 - 笔试练习
- HackerRank - 国际平台
# 可视化工具
- VisuAlgo - 算法可视化
- Data Structure Visualizations - 数据结构动画
继续深入学习,掌握数据结构的精髓!🚀