天天看点

【LeetCode 总结】Leetcode 题型分类总结、索引与常用接口函数零. Java 常用接口函数一. 动态规划二. 链表三. 哈希表四. 滑动窗口五. 字符串六. DFS、BFS七. 二分法八. 二叉树九. 偏数学、过目不忘 and 原地算法等

文章目录

  • 零. Java 常用接口函数
  • 一. 动态规划
  • 二. 链表
  • 三. 哈希表
  • 四. 滑动窗口
  • 五. 字符串
  • 六. DFS、BFS
  • 七. 二分法
  • 八. 二叉树
  • 九. 偏数学、过目不忘 and 原地算法等

前言:

是时候开一个对于我的 LeetCode 专栏的总结索引了= =

虽然说大概只刷了150道左右,不过应该也可以简单总结一下了呢~

题型主要是 LeetCode hot100 + 剑指Offer,也有其他的一些高频题

持续更新中,还有120题左右,尽量这几天弄完… QAQ

零. Java 常用接口函数

集合类

// 1. ArrayList
list.add(element); // 加到尾部
list.size();

List<int[]> list = new ArrayList<>(); 
int[][] arr = list.toArray(new int[list.size()][2]); // 链表 -> 数组
list = Arrays.asList(arr); // 数组 -> 链表

// 2. LinkedList
list.add(element); // 加到尾部
list.addFirst(element); // 加到头部

list.removeFirst();
list.removeLast();

list.getFirst();
list.getLast();

// 3. Deque:双向队列
Deque<Integer> deque = new ArrayDeque<>(); // ArrayDeque 可以作为队列、栈来用,效率都更高
deque.offerFirst(element); // 加队头 or 加队尾
deque.offerLast(element); // 也可以换成 addFirst、addLast

deque.pollFirst(); // 出队头 or 出队尾(会返回元素)
deque.pollLast(); // 也可以换成 removeFirst、removeLast

deque.getFirst();
deque.getLast();

// 4. HashMap
hashmap.put(k, v);
hashmap.get(k); // 获取 k 对应的 v
hashmap.size();
hashmap.isEmpty();
hashmap.containsKey(key1); // 判断 key1 是否存在
hashmap.containsValue(value1); // 判断 value1 是否存在

// 5. HashSet
hashset.add(element);
hashset.contains(element);
hashset.remove(element);
hashset.size()

// 6. Stack
stack.push();
stack.pop();
stack.peek();
stack.isEmpty();

// 7. PriorityQueue 优先队列(堆)
// 知识点:小顶堆存较大值,大顶堆存较小值(便于维护)
// Lambda 表达式
           

数学类

Math.max(num1, num2); // 取最大值
Math.min(num1, num2); // 取最小值
Arrays.sort(arr); // 排序数组
Arrays.sort(arr, (a, b) -> (a[0) - b[0])) // 自定义排序方式的 sort
           

字符串

// String
char[] arr = s.toCharArray(); // 转化成字符数组,提高
String s2 = s1.substring(0, 3); // 截取,闭开区间[0,3)
char c = s1.charAt(1); // 选取元素,效率比较慢
s.length(); // 用函数获取长度,数组则直接 arr.length

int num = Integer.parseInt(s); // String 转换成 int
String s1 = Integer.toString(num); // int 转换成 String
String s2 = "" + num; // 也可以这样做

// StringBuilder:这里的 leetcode 都是单线程,因此不涉及 StringBuffer
sb.append("abc"); // 添加到尾
sb.delete(1, 3); // 删除,闭开区间[1, 3)的元素
           

一. 动态规划

考察的大头了,大部分题目都用的这玩意

知识点

  • 三要素:边界处理、最优子结构、状态转移方程
  • 滚动数组:用于节约空间复杂度,可能需要通过逆序处理来实现无后效性
  • 树形dp:树结构的dp
  • 数位dp:对象是数字的各个位的dp
  • 01背包问题:取 or 不取的背包问题
  • 主要就是:如何找出三要素
  • O(1) 空间复杂度:逻辑上的数组,有时可以直接通过几个变量实现

题目

5.最长回文子串(字符串)

42. 接雨水(常考的 hard,思路还是挺好用的,在后面刷题也有类似的做法)

32. 最长有效括号(算是比较有难度的 hard 了,需要细分很多情况,考虑边界)

53. 最大子序和(常考 easy 题,思路还是很值得学习的:负收益舍弃)

128. 最长连续序列(哈希表)(被字节面过)

62. 不同路径(dp入门题)

64. 最小路径和(同上)

70. 爬楼梯(同上)

96. 不同的二叉搜索树(有点东西的,空树也算一种树,方程推导思路也值得学习,容易忘)

二. 链表

知识点

  • 这块主要是链表结点之间关系的处理
  • 头结点、尾结点的边界处理也要注意,小心空指针!

题目

2.两数相加

21. 合并 2 个有序链表

23. 合并 K 个升序列表(归并、分治)(很清晰的一道 hard,有前导题 合并 2 个有序链表)

19.删除链表的倒数第N个结点(快慢指针)

146. LRU缓存机制(手写双向链表 + 调库HashMap,注意结点关系处理)

160. 相交链表(原地算法,有点偏数学)

206. 反转链表 (递归 or 迭代,常考题了)

25. K个一组翻转链表(递归)(相当于 206.反转链表 + 递归)

三. 哈希表

知识点

  • HashMap 可以存 null 作为键值
  • 查询复杂度 O(1)

题目

1.两数之和

四. 滑动窗口

知识点

  • 感觉这类题型,大多应用主体都是字符串呀!
  • 主要涉及到几点操作:滑动窗口怎么拓增、缩小、移动

题目

3.无重复字符的最长字串(HashMap)

76. 最小覆盖子串(和上面的3很像)

五. 字符串

当然,涉及字符串的很多题目也会在四.滑动窗口、一. 动态规划中出现,这里不重复列出题目啦~

知识点

  • 写这里的题目,要对 String、StringBuilder 的库函数有一定了解噢~

题目

49. 字母异位词分组

20. 有效的括号(栈)

六. DFS、BFS

知识点

  • DFS:一路到底!
  • BFS:用到队列,一层一层地跑完
  • 剪枝:通过限定条件,减少需要递归的枝条,提高效率
  • boolean[] visited:访问数组,用于递归中记录是否访问过。一般会涉及回滚

题目

46. 全排列(DFS、队列)

39. 组合总和(DFS、队列)

22. 括号生成(DFS、剪枝)

17. 电话号码的字母组合(DFS)

78. 子集(DFS)

79. 单词搜索 && 剑指 Offer 12 矩阵中的路径(DFS)

七. 二分法

诶,二分法在 leetcode 题库里还是有一席之地的,要学好也得多实践噢~

知识点

  • 二分法和时间复杂度O(logN)挂钩!
  • 注意边界,小心死循环!
  • 分区 [left, mid],[mid + 1, right],注意 mid 的取值(向上 or 向下)
  • while(left < right) 循环中,分两种情况、还是三种情况(大于、等于、小于)

题目

34. 在排序数组中查找元素的第一个和最后一个位置

33. 搜索螺旋排序数组

八. 二叉树

知识点

  • 搜索二叉树:左子树均大于根,右子树均小于根
  • 完全二叉树:倒数第二层结点全满
  • 满二叉树:倒数第一层结点全满

题目

102. 二叉树的层序遍历(DFS + 队列即可)

94 & 144 & 145. 二叉树的前序、中序、后序遍历(迭代用栈,后序新增pre结点)

98. 验证二叉搜索树(DFS、中序遍历)(pre + 中序,保证当前最左边 && 次左边对比

101. 对称二叉树(递归)

102. 层序遍历(队列、递归)

九. 偏数学、过目不忘 and 原地算法等

这一块是记录那些比较偏数学,或者容易初见杀,但是实际代码量不多 or 写过一遍就忘不掉思路的题目。

知识点

  • 原地算法:O(1)空间复杂度,要求原地的题目不少,看看能不能总结点规律出来

题目

55. 跳跃游戏(贪心法)

48. 旋转图像(原地算法、矩阵转置)

15. 三数之和(双指针)

11. 盛最多水的容器(双指针)

7. 整数反转(对溢出判断的做法,很值得学习!)

6. Z字形变化(主要考察思路的一道题,思路比较独特,类似压缩)

56. 合并区间(双指针,排序)(用了一波 Arrays.sort(arr, Lambda),还有链表 - 数组转化)

84. 柱状图中最大的矩形(单调栈)

  • 找数合集:

剑指 Offer 03. 数组中重复的数字(原地)数组转换成逻辑上的哈希表,很有意思

136. 只出现一次的数字(位运算)亦或性质:同数得0,与0不变

448. 找到所有不存在的数(原地) 数组常用的取负、取余处理

287. 寻找重复数(原地)转换成逻辑上的链表,再进行找入环点操作(环形链表II的兄弟题目

26. 删除有序数组中的重复项(原地)挺简单的。。逐个推就行