整理中
算法分类
1.贪心算法
2.回溯 & 递归
3.双指针法(排序)(n)
4.滑动窗口(n)
5.前缀和(n)
- 求数组的连续子数组和类的问题,可以用到前缀和或滑动窗口、双指针,具体看复杂度要求。前缀和+二分法复杂度O(nlog(n))。
leetcode 325. 和等于 k 的最长子数组长度
6.二分法-复杂度O(log(n))
- 第k小数
- 复杂度要求log(n)或nlog(n),想到结合二分法、树、堆等结构
7. 单调栈
8. Trie树
使用字典树的目的是查找某一个串 s 是否在一个串的集合 SS当中,并且当我们知道 s 是否在 S 中之后,可以快速的知道在 s 后添加某一个新的字母得到的新串 s’是否在 S 中,这个转移的过程是 O(1) 的。这是我们采用字典树而放弃使用 HashMap 类容器的一个理由,这些容器不能实现 s到 s’的 O(1)转移,但字典树可以。
9. 字符串哈希
题目类型
一、数组类
Ⅰ 数组中重复值
- 二进制
- 数组范围1~n,可以通过比较数组所有数某位的1 的总个数和1~n的差别
- 异或,相同数异或为0
-
置换到与下标一致的位置
-
抽屉原理
-
环形链表+快慢指针(奇葩)
- 对 nums[] 数组建图,每个位置 i 连一条i→nums[i] 的边。由于存在的重复的数字 target,因此 target 这个位置一定有起码两条指向它的边,因此整张图一定存在环,且我们要找到的 target 就是这个环的入口,那么整个问题就等价于环形链表的入口,用快慢指针。
Ⅱ 缺失的值
给定数组范围1~n首先可以确定:
对于一个长度为 NN的数组,其中没有出现的最小正整数只能在 [1,N+1] 中。这是因为如果 [[1,N] 都出现了,那么答案是 N+1,否则答案是 [1, N] 中没有出现的最小正整数
- 用下标 i 标记数字i是否出现
- 置换到对应位置
二、二叉树类
Ⅰ遍历
- 在一些题目中需要转换为前序、中序或后序遍历来解决,根据不同题目场景,需要调整遍历的顺序,如114.二叉树展开为链表,思路是每次将左字数挂到右子树上,但是会丢失原本右子树的信息,因此使用右-左-中的后序顺序遍历,结合栈,保存根节点,保证了先把右子树保存,避免丢失。
(
三、图
深度优先遍历 & 广度优先遍历
Ⅰ环
- leetcode 210 课程表
有先修课程,判断是否能顺序修完所有课程。判断是否有环,无环则可以成功。使用三个标记判断在遍历的过程中是否有环:
- 【已完成】-- 所有邻居节点都已遍历;
- 【遍历中】– 遍历了部分邻居,说明当前节点就是在此【遍历中】的节点递归遍历到的,一旦遇到遍历中的节点就说明成环;
- 【未遍历】-- 继续递归遍历此节点。
Tips
- 比较长度不同的字符串时,短的可以赋值为0 (在非负数的情况下)leetcode 165 比较版本号
//这个技巧经常用到,当一个已经遍历结束的话,我们将其赋值为 0
String num1 = i < nums1.length ? nums1[i] : "0";
String num2 = j < nums2.length ? nums2[j] : "0";