LeetCode热题-解题思路速记


来源CodeTop

按照热度顺序

字节的to题目

1-10

3.无重复字符的最长子串

滑动窗口,临时变量,hash表记录最近一次出现的下标

临时变量记录已经遍历过的最长的不重复子串

遍历数组:一旦发现有重复的,就重置滑动窗口的起始位置到当前位置

146、LRU缓存机制

1、hashmap + Deque
    使用deque来保存最近使用的元素,每次读写、,都调整deque的元素
        peekFirst、pollFirst

2、LinkedHashMap  + 自定义removeEldestEntry

25、K个一组反转链表

k个一组,反转多次
最后判断反转的节点个数若不等于k,则在翻转一次,转回来

206.反转链表

215、数组中的第K个最大元素

手写快排?三路快排?

15、三数之和

先排序,然后再从左到右遍历,每个小于0的数字target,在右边找到两个相加和等于-target的和,此刻的三个数字,即为一个结果

103、二叉树的锯齿形层次遍历

用两个栈、两个队列,都行

200、岛屿数量

用一个二维数组,保存是否已经被访问过
用一个dfs,表示当前坐标是否是未被访问过的陆地,向上下左右深度搜索

121、买卖股票的最佳时机

找到当前的最小值,遍历过程中更新,然后求利润,并求利润最大值

33、搜索旋转排序数组

二分查找 l、r,针对target 和 mid值,进行区分
相等,则找到,返回
不相等,则具体判断target和mid值、左边界、右边界的大小,调整l、r
最后,需要对l、r相等的情况判断

11-20

1、两数之和

暴力搜索
使用hash表

236、二叉树的最近公共祖先

用两个队列,保存两个节点的访问路径
然后依次弹出,找最后一个相等的节点,即为所求

42、接雨水 (困难)

解法1:
    leftMax[i]:表示height[i]左侧的最大高度
    rightMax[i]:表示height[i]右侧的最大高度
    每个点的接雨水量,等于 min(leftMax[i] ,rightMax[i]) - height[i]
    然后累加即可

解法2: 单调栈
    栈中保存的,应该是上一个『山头』,即递减的第一个元素
        栈为空:入栈
        栈顶元素大于当前元素,累加这一层的雨水量
        栈顶元素等于当前元素:不累计,不出入栈
        栈顶元素小于当前元素:累加这一层的雨水量,栈顶元素出栈,当前元素入栈

54、螺旋矩阵

四个方向,写四个打印函数,依次打印即可

5、最长回文子串

解法1:
动态规划
    dp[i][j] :字符串中从 【i, j】的子串是否为回文子串
        一次遍历,求出长度为1的回文子串
        一次遍历,求出长度为2的回文子串
        预设长度从3开始,扩散求最长的回文子串
中心扩散
    对每个字符,求从此字符开始,能扩展到的最长回文子串长度

160、相交链表

分别遍历,求长度,求长度差
然后长的先走,慢的后走,最终会相遇的

53、最大子数组和

简单do

46、全排列

用递归

31、下一个排列

TODO
先从右向左,找第一个nums[i] > nums[i-1]的下标i,
然后在i 的右边,找第一个刚大于nums[i-1]的元素下标j
交换nums[i-1],nums[j]
最后逆序nums[i:n-1]即可

23、合并K个排序链表


21-30

300. 最长上升子序列

用一个数组dp,dp[len] 表示最长上升子序列最长的时候,对应的最后一个数字是多少,遇到比当前元素大的,直接设值,len+1,
否则,二分查找,找第一个大于当前元素的dp位置,更新进去

199. 二叉树的右视图

使用两个队列,使用add、poll操作

143. 重排链表

方法1:遍历,使用list保存节点内容,再遍历,改变节点指向
方法2:先求中点、在反转右边的链表、最后合并左半边和右半边的链表,记得最后避免出现环

20. 有效的括号

使用栈,进行匹配消消乐

102. 二叉树的层序遍历

一个队列 + 一个遍历报错当前层次的元素个数

88. 合并两个有序数组

从尾部开始合并

21. 合并两个有序链表

简单题目

92. 反转链表 II

遍历加反转

141. 环形链表

快慢指针,判断是否有环

415. 字符串相加

模拟即可,记得处理最后的进位

31-40

124. 二叉树中的最大路径和

递归,针对当前节点,考虑一下三种情况
仅考虑本节点的值
考虑左右子节点中其中任一个节点的和本节点值的和
考虑左右子节点和本节点值的和,取最大值,作为本节点的结果
最后去全局的最大和

41. 缺失的第一个正数 (困难)放弃

72. 编辑距离 (困难)放弃

56. 合并区间

对每个区间,按照开始字段start进行排序,然后依次判断是否可以合并
需要自定义排序方法

221. 最大正方形

猜测,使用dp[i][j],表示以i,j 为右下角时候的正方形中,最大的正方形边长  
    转移方程为:dp(i,j)=min(dp(i−1,j),dp(i−1,j−1),dp(i,j−1))+1
    还需要考虑边界情况

148. 排序链表

合并排序
1、快慢指针,分成两段
2、对左右两段,进行合并排序
记得断开两段之间的链接,避免出现环

69. x 的平方根

二分查找
    mid * mid 后和x比较
注意需要先转换为long,再比较,避免int相乘后溢出为负数

165. 比较版本号

逗号分割,转换为数字,进行比较
双指针,遇到.的时候,暂停,进行比较

129. 求根到叶子节点数字之和

深度优先搜索,需要将根节点的临时结果带到下一层的子节点中
需要注意,递归结束返回后,需要将结果*10,再进行后续处理

105. 从前序与中序遍历序列构造二叉树

先在根据前序的结果,求在中序中的中间位置,分成左右两部分
然后再依次构建二叉树

41-50

101. 对称二叉树

简单递归即可
迭代的话,用两个队列,对称入队,依次进行比较

补充题4. 手撕快速排序

leetcode上说,需要针对基本有序的数组进行优化

32. 最长有效括号 (困难)

用栈,栈中保存遍历过程中,未匹配上的)的下标

22. 括号生成

用深度优先搜索,特殊情况:只有当剩余( 的个数 小于 ) 的时候,才可以继续dfs进行匹配

93. 复原IP地址

回溯 + 剪枝

4. 寻找两个正序数组的中位数

若两个数组长度为n、m,则等价于求第(n+m)/2小的数
使用二分查找的方法,依次在两个数组中移动指针,并比较大小

76. 最小覆盖子串 (困难)

滑动窗口 + hash表

39. 组合总和

142. 环形链表 II

78. 子集

51-60

322. 零钱兑换

TODO 

1143. 最长公共子序列

使用动态规划

82. 删除排序链表中的重复元素 II

162. 寻找峰值

二分查找,找到任意一个峰值即可

232. 用栈实现队列

容易

112. 路径总和

94. 二叉树的中序遍历

2. 两数相加

394. 字符串解码

19. 删除链表的倒数第N个节点


文章作者: 王利康
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 王利康 !
  目录