leetcode前200算法题中的模式总结

297 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

leetcode中有很多算法题,这里对其前200题中的基本模式进行总结。 leetcode.cn/problemset/…

线性结构 数组或链表

排序 快排,桶排序,计数排序,插入排序,冒泡排序

二分

  • 排序后二分
  • 不是有序的,想办法在有序的中二分
  • 只要能抛弃一半就能二分。

单指针

  • 从左向右遍历
  • 从右向左
  • 枚举中心向两边
  • 数字异或

双指针

  • 滑动窗口从左向右
  • 从两端向中间
  • 快慢指针
  • 快慢指针到终点,互换起点再继续

3指针,4指针

  • first指针从0到1遍历, second, third指针从first+1, end两端向中心靠近

单调栈,单调队列

  • 与滑动窗口结合

动态规划

  • dp[i] = dp[i-1]
  • dp[i] = dp[i-k]
  • dp[i][K] i位置有k中情况
  • 逆序DP
  • 两两,到33,到44,到55的DP

旋转与翻转

  • 旋转问题可以用翻转解决

其他

  • 位运算优化
  • 打表

线性结构,两个数组或链表

动态规划

  • dp[i][j]与dp[i-1][j],dp[i][j-1]
  • 滚动数组优化
  • 原地复制

线性结构,k个数组或链表

  • 归并
  • 堆中放每个的表头

矩阵结构

  • dp[i][j]=dp[i-1][j],dp[i][j-1],dp[i-1][j-1]
  • 位运算优化
  • 矩阵上二分查找,按列,按行
  • 回溯+剪枝
  • 按层遍历外内中
  • 选中0行0列为临时存储

  • 先根遍历
  • 后根遍历
  • 中根遍历
  • Morris 遍历
  • DFS
  • BFS
  • 二叉搜索树:遍历寻找一个或者多个结点,>向右,<向左
  • 中序遍历考虑相邻两个元素
  • 上下层遍历
  • 栈辅助遍历,考虑栈与树
  • 插入虚拟结点,返回时再入入值
  • 利用i层计算i+1层
  • 动态规划,按层
  • 转树转图,一个点变多个点
  • 双向广搜
  • 结点数:(2^deep)-1
  • 二进制编码,0左1右

  • 问题转为图

有难度的算法

  • KMP Manacher
  • 状态机(DFA,NFA)
  • 全排列下一个
  • 牛顿迭代
  • 矩阵快速幂
  • 树的Morris 遍历
  • 格雷码
  • n &= n - 1;
  • 拓扑排序

困难的题目

  • 给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。

  • 柱状图中的最大矩形。类似接雨水

  • 生成n个数的格雷码

  • 前序和中序遍历恢复出二叉树

  • 二叉树按先序遍历展开为链表

  • 发糖果

  • 给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。

  • 环形列表找出环入口

  • 给你一个数组 points ,其中 points[i] = [xi, yi] 表示 X-Y 平面上的一个点。求最多有多少个点在同一条直线上。

  • 给定一个整数 n ,返回 n! 结果中尾随零的数量。

  • 质数:埃氏筛 线性筛

  • 重复的DNA序列

  • 给你两个整数 left 和 right ,表示区间 [left, right] ,返回此区间内所有数字 按位与 的结果(包含 left 、right 端点)

  • 快乐数

  • 同构字符串

  • 课程表:选课有依赖,拓扑排序