本文主要记录了博主的 Leetcode 算法刷题记录,方便以后查询复习。
图论
岛屿数量
深度优先遍历,基本思路为,遇到一个岛就把这个岛给沉没掉,然后统计数加 1。
腐烂的橘子
广度优先遍历,利用循环比较好做,这边需要注意广度优先遍历的一些条件,辅助函数用于推入队列,上下左右扩散的过程还是由循环过程去做。
课程表
广度优先遍历,采用图和入度的概念进行求解。
- 构建入度数组,使用哈希表以该课程为键,依赖该课程的数组为值,建立哈希表。
- 将入度为 0 的数组推入队列。
- 迭代,入度为零的课程继续推入队列
实现 Trie (前缀树)
采用迭代对象来求解,可以考虑使用数组的reduce
方法。
回溯
全排列
无他,惟手熟尔。😊
字集
可采用幂集算法和深度遍历解决。
对于幂集算法
- 左移
n
位,循环。
- 循环数组的长度次,推入所有的有效数字。
电话号码的数字组合
采用回溯算法,从前面回溯到后面
组合总和
排序candidates
数组,递归回溯,选择当前数字或者不选择当前数字然后跳过。
括号总和
采用深度遍历的方式进行求解,左侧括号在小于num
的情况下可以一直推入,右侧括号只有在左侧括号数量大于右侧括号才能推入。非常经典的回溯加剪枝。
单词搜索
谨慎使用fill
方法,主要利用深度遍历与标记数组。通过每个数组都尝试遍历。注意空数组不会被Map
等方法遍历,需要先fill
值再遍历。
分割回文串
深度遍历加上动态规划。我能说我其实是背下来的吗?🤧
N 皇后
二分查找
搜索插入位置
二分查找的变式,稍作修改,注意ans
的初始值需要设置为num.length
来处理越界情况。
搜索二维矩阵
依旧是二分查找的变式,查找到大于当前数字的一行,然后对当前这一行进行二分查找。另外这里例子是Z
字型查找的一个特例,也可使用Z
字型查找的方式,更简单。
在排序数组中查找元素的第一个和最后一个位置
二分查找的变式,注意如何查找到第一次出现的元素与最后一次出现的元素,这边采取循环的方式更好写一些。
搜索旋转排序数组
来详细讲解一下这道题目的思路
考虑mid
在前区间与后区间的两种情况
- 在前区间:只有满足
target >= nums[0] && target < nums[mid]
的情况才有high = mid - 1
其他情况都是low = mid + 1
。
- 在后区间:只有满足
target > nums[mid] && target <= nums[n - 1]
才有low = mid + 1
其他情况都是high = mid - 1
。
- 注意前区间必须是满足
>=
以确定边缘情况。
寻找旋转排序数组中的最小值
寻找两个正序数组的中位数
技巧性较强的题目,菜就多练。🦀
栈
有效括号
非常经典的题目,细心点就可以做出来。
最小栈
采用辅助栈进行求解,注意考虑栈为空的边缘情况。
字符串解码
可采用正则表达式的解法与数字栈与字符栈的解法来计算,类似逆波兰表达式的计算。注意对多位数字的置零处理,和字符串栈的转换。
每日温度
注意栈中存储的是数组的下标,单调栈一般是遇到大的元素开始做相关的操作。
堆
数组中的第 K 个最大元素
存在快排和堆两种排序算法,熟能生巧,注意快排的边界判断,菜就多练。🦀
贪心
买卖股票的最佳时机
贪心算法,每次都找到前一个的最优条件
跳跃游戏
贪心算法,每次在符合条件情况下更新最长的长度。
动态规划
爬楼梯
经典问题,甚至让我觉得有点像斐波那契数列。🤔
打家劫舍
常规的动态规划题目,注意状态转移方程的书写,注意初始条件的设置,并不影响整体的判断。
单词拆分
这边还是有些技巧,首先dp
数组的长度为n + 1
并且第一项为true
,然后状态转移方程如下,值得仔细理解。
最长递增子序列
维护一个dp
数组,数组中的每个值为当前索引的最长子序列长度,然后动态规划求解。
多维动态规划
不同路径
二维动态规划,也可直接使用一维数组来模仿,重点在于当前节点的次数只会来源于左上。
最小路径和
相同的动态规划思路,左边和上面哪个更小取哪个,注意需要初始化边缘的行与列。
最长回文子串
中心扩散法直接秒,经典无需多言。
技巧
多数元素
哈希表求解
下一个排列
从右往左找到较小的一个数,然后找到较大的一个数然后需要尽量靠右,交换后然后反转。