备战实习 leetcode总结笔记

本文总结了作者在备战实习期间的LeetCode刷题体验,重点介绍了数据结构如数组、链表、二叉树的操作技巧,以及回溯法、动态规划等算法的应用。通过实例解析了链表的合并、删除、翻转等问题,并探讨了二叉树的遍历和排序算法。此外,还分享了动态规划和贪心法在解决复杂问题中的策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



刷题主要参考labuladong的算法小抄,写的相当nice,有系统的刷题。一个月左右刷完。应付面试基本没有问题。

1 刷题心得

1 数据结构必刷,学了数据结构,有个框架思维,内功更强。
2 算法:计算机擅长的事情就是穷举(遍历)!我们要做的就是对一个问题实现聪明的穷举(利用一些先验信息排除不需要遍历的解),无遗漏的穷举
聪明的穷举举例子:利用各种先验信息,最常见的排序信息,大小信息。二分。

2 数据结构

从存储角度来看,将其分为两类,数组(连续存储)以及链表(不连续存储)。其他数据结构都是在其基础上进行构造。

  1. 简单结构:栈与队列,处理扩容问题,数组链表都可以实现。
  2. 组合结构:散列表,数组加链表。树和图
  3. 常用:二叉树,二叉搜索树,单调栈,优先队列(二叉堆实现),

对数据结构的操作:增删改查

  1. 线性遍历, for+while
  2. 非线性遍历:递归 以二叉树为例
    前序遍历:刚进入该节点
    中序遍历:该节点左子树已经遍历完,然后进入该节点
    后序遍历:将要离开该节点,此时可以用到的信息更多。

3 链表总结

a) 基本技巧
  1. 合并两个有序链表: 双指针
  2. 合并k个有序链表:优先队列,每次选出k个指针的最大或者最小。
    from collections import PriorityQueue
    Q=PriorityQueue()
    Q.put()
    Q.get()
    堆的上浮与下沉
  3. 环形链表:快慢指针,每次多走一步,相差k步
  4. 寻找中间节点:快慢指针,快指针每次走两步
  5. 删除倒数第N个节点:快指针比慢指针一直快k步。
  6. 相交链表:双指针+交互处理(遍历完自己遍历对方)。
b) 晋级技巧
  1. 翻转整个链表:递归(翻转自己等于翻转自己的下一个节点开始的链表)+后序遍历(即将离开该节点,修改一个指针)。或者通过迭代实现,需要三个变量,pre,cur,nxt。
  2. 翻转前N个值:与反转整个类似,需要在递归时记录当前是第几个,写出base case,记:新的头结点。
  3. 翻转部分位置(m,n):递归+翻转前N个。
  4. k个一组翻转链表:迭代法更清晰。找到边界,然后递归。

4 数组总结

  1. 前缀和:需要频繁的求解数组和。
    在这里插入图片描述
  2. 差分数组:对整段数组进行同样的操作
    在这里插入图片描述
  3. 花式遍历:旋转图像:转为关于x,y轴或者对角线对称。螺旋矩阵:四个控制变量,右上和左下之间加入判断。或者一个圈数变量。
  4. 滑动窗口:两个while控制指针,字典记录关注的元素
  5. 二分搜索:在这里插入图片描述
  6. 随机权重:前缀和+二分搜索边界
  7. 二分搜索优化问题求解:单调函数+初值
  8. 田忌赛马:按顺序排好,比得过的比,比不过用最差的比。
  9. 常数时间删除元素:字典记录每个元素的索引,与最后一个元素交换位置,然后删除最后一个元素。
  10. 数组去重:单调栈,新进来的元素与栈顶比较,不满足就删除。

4 二叉树总结

在这里插入图片描述

  1. 前中后序遍历: 前序遍历;对应第一次进入这个节点 只有之前的信息
    中序遍历:对应左子树全部访问了 然后进入这个节点
    后序遍历:要从这个节点离开,之前的信息全部都访问了

  2. bfs层序遍历: 广度优先 一次往外扩张一圈 需要记录队列长度 for循环+while

  3. 序列化与反序列化
    深度优先 一撸到底 先序遍历
    遇到#return

  4. 归并排序
    天然的 左边索引大于右边索引! 可以计算翻转对

  5. 快速排序
    是一棵二叉搜索树
    通过交换位置解决
    划分函数 传入 low 与high
    下标low对应的元素为pivot,双指针 比较low+1,到high的元素与pivot的大小。返回 pivot对应的正确位置!找到第k大的,类似二叉树的剪枝操作,决定左右。

  6. 二叉搜索树
    中序遍历有顺序!全局变量记录!
    删除:找到左子树最大或者右子树最小的来交换位置 统一为base case
    搜索:自带剪枝操作 根据大小决定遍历左树还是右树
    插入:尽量插在尾端
    验证:后序遍历
    构造:选定一个 分左右 构造左右子树

  7. 后序遍历
    不仅可以返回一个值!可以返回多个值

  8. 最近公共祖先:
    后序遍历
    把左右子树返回的东西 继续返回!

  9. 完全二叉树
    最多允许最后一层不满 并且先在左边

  10. 满二叉树 每一层都满了

5 设计数据结构总结

在这里插入图片描述

6回溯法+bfs总结

回溯:记住两个东西,状态加选择!当前的状态,以及一个选择池。
bfs:for+while+队列。一次向外扩张1+visited记录访问过的节点。

7 动态规划总结

较难的题一般转到后序遍历即可!

  1. 编辑距离 dp[i,j]有左上角三个元素决定
    在这里插入图片描述在这里插入图片描述

  2. 最长增长子序列 以i为结尾的最长增长子序列在这里插入图片描述

  3. 最大子数组和 以i为结尾的最大子数组和在这里插入图片描述

  4. 最长公共序列 属于难问题 倒着做!
    在这里插入图片描述
    将大问题转为多个小的子问题,比较小问题的大小。
    一般需要写字典记录全局结果

  5. 最小路径和 简单问题
    在这里插入图片描述

  6. 骑士求公主 较难问题倒着做
    在这里插入图片描述

  7. 01背包
    在这里插入图片描述

  8. 子集背包 为了求的dp[n][sum/2]是否为真
    因此子问题也这么设计 bool变量
    在这里插入图片描述

  9. 打家劫舍 选择 或者不选择
    在这里插入图片描述

10.股票买卖
在这里插入图片描述
在这里插入图片描述
10.
在这里插入图片描述

8 贪婪法总结

  1. 区间覆盖问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值