笔试
█ 1.双指针
04. 二维数组中的查找 <有序的,while>
22. 链表中倒数第k个节点 《输出为链表》 双指针 让中间差着 k , (i=1 i<k)
24. 反转链表 《真正实现了翻转》 cur next reverhead_0 while(cur!=null)
- 最长不含重复字符的子字符串 《 定义一个hashmap<Character,Index>, 双指针 》
- 丑数 《 多指针 定义 2,3,5变量》
59-1 滑动窗口的最大值 《 对应的是数组,一个k大小的滑动窗口,求这里面的值最大的 ,Deque for(int j = 0, i = 1 - k; j < nums.length; i++, j++) 》
59 - II. 队列的最大值 《 拿到队列里的值,用两个队列,一个辅助,,Queue,Deque》
- 包含min函数的栈 《 一直出栈,但是找到当前栈中最小的数 》 用两个栈 s1是正常的 s2用来存最小值
█ 2.滑动窗口
- 连续子数组的最大和 《这个甚至 不用滑动窗口,直接max比较就行,sum<0==>sum=0 》
- 和为s的两个数字 《 递增的数组,两头找两个数字 》
57 - II. 和为s的连续正数序列 《 递增的数组是1,2,3,4,5,6 和不限制大小 》 滑动窗口,sum小 右边界向右; sum大 左边界向右
59-1 滑动窗口的最大值 《 对应的是数组,一个k大小的滑动窗口,求这里面的值最大的 ,Deque for(int j = 0, i = 1 - k; j < nums.length; i++, j++) 》
59 - II. 队列的最大值 《 拿到队列里的值,用两个队列,一个辅助,,Queue,Deque》
█ 3.二分查找 & 排序
二分查找的特点: while(i<j){m=(i+j)/2; if}
- 旋转数组的最小数字 《先把尾部消掉,之后传统二分lr,mid来比》
53 - I. 在排序数组中查找数字 I 出现的次数 《 直接二分 ,两个相邻数 相减 》
53 - II. 0~n-1中缺失的数字 《 直接二分,到最后不等的那个》
- 和为s的两个数字 《 递增的数组,两头找两个数字 》
- 构建乘积数组 《 把数组中的每个元素乘起来,但是不包含第i个,每个元素都是,,for i左边的乘积 for i右边的乘积 在相乘》
- 把数组排成最小的数 《 把这些数 拼接起来 看最小值 》 快速排序 快排
█ 4.搜索 & 遍历 & 递归
- 矩阵中的路径《有无此路径,启动点不定》 for_i(for_j dfs) 递归 dfs(上下左右)
- 机器人的运动范围《启动点定》 递归 dfs(上下左右)
- 礼物的最大价值 《 加了 0行0列 两个for嵌套 求这个路径上经历的值的和最大》
█ 5.动态规划
10- I. 斐波那契数列 (fn-2 + fn-1)
10- II. 青蛙跳台阶问题 (fn-2 + fn-1)
14- I. 剪绳子《剪出来的 乘积最大》 for_n(for 剪) -> dp[i] = Math.max(Math.max(jdp[i-j], j(i-j)), dp[i]);
14- II. 剪绳子 II n很大,用3取%
- 丑数 《 多指针 定义 2,3,5变量》
- 股票的最大利润 《 找到低点买入 高点卖出,,但是要先min买入 后max卖出》
█ 6.分治
█ 7.位运算 & 数学
- 二进制中1的个数 《while(n!=0) n = n & (n-1);》
- 数值的整数次方 《pow(x, n) & >> 》
- 打印从1到最大的n位数 《n=9 就是打印到9个n位 & >> 》
- 求1+2+…+n 《 不能用。。。》boolean && 短路 + 递归。
- 不用加减乘除做加法 《 用& << ^ 做 两个数的加法 》
56 - I. 数组中数字出现的次数 《 寻找 每个num[i] 出现的次数 中 只出现1次 一次的数字 》 通过 & ^ while来实现的。
56 - II. 数组中数字出现的次数 II 《 相比于 上一个,也是找只出现1一次的数字,但是没有复杂度要求 》 存到HashMap中<num, index> !map.containsKey(key)
43. 1~n 整数中 1 出现的次数 《 所有的数字 找规律的数学题 》
44. 数字序列中某一位的数字 《0123...111213 找第几位上 对应的数字, 找规律的数学题》
- 构建乘积数组 《 把数组中的每个元素乘起来,但是不包含第i个,每个元素都是,,for i左边的乘积 for i右边的乘积 在相乘》
█ 8.栈 stack
- 用两个栈实现队列 《 一个栈push( pop())实现插入队列 和 删除队列元素 操作 》
- 栈的压入、弹出序列 《 根据压入顺序和出栈顺序,判断出栈顺序 正确否 》
- 包含min函数的栈 《 一直出栈,但是找到当前栈中最小的数 》 用两个栈 s1是正常的 s2用来存最小值
数组模拟栈 P76
█ 9.计算器
栈实现模拟计算器 《一个数栈 + 一个符号栈》
中缀 后缀 逆波兰计算器 有对应的题目还有
z 227. 基本计算器 II
z 770. 基本计算器 IV
z 991. 坏了的计算器 《通过*2 -1 得到结果Y,所花费的最小操作次数。 反向,递归 或者不递归》
█ 10.队列 queue
- 最小的k个数 《 用 PriorityQueue 》 + queue.size() > k 就往外poll()
59-1 滑动窗口的最大值 《 对应的是数组,一个k大小的滑动窗口,求这里面的值最大的 ,Deque for(int j = 0, i = 1 - k; j < nums.length; i++, j++) 》
59 - II. 队列的最大值 《 拿到队列里的值,用两个队列,一个辅助,,Queue,Deque》
数组模拟队列,定义front和rear进行操作,在 P32 3.2
数组模拟环形队列 rear=(rear+1)%maxSize; P34 添删都在rear 第一个
█ 11.字符串
- 替换空格 《charAt》
- 字符串的排列 《 当成 字符串的 排列组合 输出全部的结果 》 s.toCharArray(); HashSet去重,各种交换
- 把数字翻译成字符串 《 0-a 》
- 最长不含重复字符的子字符串 《 定义一个hashmap<Character,Index>, 双指针 》 map.containsKey(key)
- 丑数 《 多指针 定义 2,3,5变量》
- 把字符串转换成整数 《 可以有+- “ ”,截止到不是数字的位置 还有各种 字符串转化 拼接》字符串转换
- 第一个只出现一次的字符 《 用hashmap来存 Chara,Boolean包含不 》 !dic.containsKey(c)
相似
56 - II. 数组中数字出现的次数 II 《 相比于 上一个,也是找只出现一次的数字,但是没有复杂度要求 》 存到HashMap中<num, index> !map.containsKey(key)
58 - I. 翻转单词顺序 《 一句话,直接 split 》
58 - II. 左旋转字符串 《 字符串,charAt() 》
█ 12.链表
- 从尾到头打印链表 《反向》 stack || 数组i=tail
24. 反转链表 《真正实现了翻转》 《 新链表head_0 cur next 》 while(cur!=null)
22. 链表中倒数第k个节点 《输出为链表》 双指针 让中间差着 k , (i=1 i<k)
18. 删除链表的节点 《res.next = head 》+《 temp = res》+ 《temp.next = temp.next.next》
25. 合并两个排序的链表 《 排序 新链表head_0 cur同_用来返回 》 while(两个都不为空)
35. 复杂链表的复制 《next + random》 HashMap(node, node.val)
52. 两个链表的第一个公共节点 《 定义两个node, 会重逢 》
双向链表 P60删除 P57添加 先next再pre,需要一个temp
- 圆圈中最后剩下的数字 《 约瑟夫环Josephu ArrayList移除第m个 ; index = (index + m - 1) % n; 》 P69环形链表出圈
36. 二叉搜索树与双向链表 《树循环排序双向链表 把左右节点 当成 双向 》
█ 13.树 递归
- 重建二叉树 《 前序遍历+中序 》 递归 前序第一个是根 中序中间的是根
- 二叉搜索树的后序遍历序列 最后一个是根 后序最后一个是根
- 二叉搜索树的第k大节点 《 中序遍历存到ArrayList get就行 》
- 树的子结构 《 b是a的子树 》 两层递归 ( 查左右树 && 树的左=左 右=右 )
- 二叉树的镜像 《 建 一个新的 镜像 树 》 同样是递归不用想那么多 系列
- 对称的二叉树 《 树本身是对称 》同样是递归不用想那么多 系列
32 - I. 从上到下打印二叉树 《层序遍历 一个数组》 队列只管移除 + 进左右 需要 Queue(LinkedList) + ArrayList + int[]
32 - II. 从上到下打印二叉树 II 《层序遍历 一层一个》 队列需要单开for来移除 + 进左右 需要 Queue(LinkedList) + ArrayList
32 - III. 从上到下打印二叉树 III 《层序遍历 一层一个,还要反方向》 flag tmp.add(0, node.val); //从头部插入
- 序列化二叉树 《同样的 层序遍历》《 层序遍历 生成 树 》
- 二叉搜索树与双向链表 《 把左右节点 当成 双向 》
55 - I. 二叉树的深度 《 递归的出奇 》
55 - II. 平衡二叉树 《 通过递归每个树的 深度 不大于1 》
68 - I. 二叉搜索树的最近公共祖先 《 递归 找父节点 》
68 - II. 二叉树的最近公共祖先 《 没有排序了,父节点 》
- 二叉树中和为某一值的路径 《 节点值的和为输入整数的所有路径。 从头到尾 》
最短路径例题讲解
LeetCode 1162. As Far from Land as Possible 离开陆地的最远距离(Medium)
层序遍历的一些变种题目:
LeetCode 199. Binary Tree Right Side View 找每一层的最右结点
LeetCode 515. Find Largest Value in Each Tree Row 计算每一层的最大值
LeetCode 637. Average of Levels in Binary Tree 计算每一层的平均值
对于最短路径问题,还有两道题目也是求网格结构中的最短路径,和我们讲解的距离岛屿的最远距离非常类似:
LeetCode 542. 01 Matrix
LeetCode 994. Rotting Oranges
还有一道在真正的图结构中求最短路径的问题:
LeetCode 310. Minimum Height Trees
█ 14.递归
- 正则表达式匹配 《* . 》
z 991. 坏了的计算器 《通过*2 -1 得到结果Y,所花费的最小操作次数。 反向,递归 或者不递归》
█ 15.堆
- 最小的k个数 《 用 PriorityQueue 小顶堆 》 + queue.size() > k 就往外poll()
- 数据流中的中位数 《 小顶堆 + 大顶堆 》 min.add(max.poll()); 大顶堆的个数 >= 小顶堆的个数 max.add(min.poll());
█ 16.图
█ 17.其他数据结构
- 数组中重复的数字
█ 18.逻辑题
- 表示数值的字符串 《是不是 +-e ?? 设置 Boolean开关》
- 顺时针打印矩阵 《顺时针打印出 每个数 逻辑》
- 数组中出现次数超过一半的数字 《 投票题 判断 过半的 》
- 扑克牌中的顺子 《 这个 进行了 排序sort,所以可以统计joker nums[4]-nums[joker<5 》
- 把字符串转换成整数 《 可以有+- “ ”,截止到不是数字的位置 还有各种 字符串转化 拼接》字符串转换