ac酱のSecret Base Talk is cheap!

leetcode 刷题记录表


记录leetcode上刷题的进度,并且记录简要思路。

check list

编号 题目 开始时间 简要思路
no.144 二叉树的前序遍历 19.09.01 递归(最简);迭代(栈;莫里斯遍历
no.94 二叉树的中序遍历 19.09.01 递归(最简);迭代(莫里斯遍历
no.145 二叉树的后序遍历 19.09.02 递归(最简);迭代(栈;莫里斯遍历)(144修改后倒序)
no.102 二叉树的层次遍历 19.09.02 迭代(易理解、bfs、队列);递归(dfs)
no.104 二叉树的最大深度 19.09.07 递归(最简);迭代(待整理)
no.101 对称二叉树 19.09.07 递归;迭代(栈;bfs(待整理))
no.112 路径总和 19.09.07 递归(全部计算后对比;每次计算后对比);迭代(待整理)
no.106 从中序与后序遍历序列构造二叉树 19.09.11 递归(传递拷贝(占用过多额外内存);传递索引)
no.105 从前序与中序遍历序列构造二叉树 19.09.11 递归(传递索引)(待整理)
no.116 填充每个节点的下一个右侧节点指针 19.09.12 迭代(BFS,使用了o(n)额外空间,不符合要求;常量级额外空间);递归
no.117 填充每个节点的下一个右侧节点指针 II 未解决  
no.26 删除排序数组中的重复项 19.09.18 双指针覆盖/pop;倒序pop
no.122 买卖股票的最佳时机 II 19.09.19 贪心算法;真正算出哪天买哪天卖(双指针)
no.189 旋转数组 19.09.19 去尾,尾插头;切片拼接(不符题意常数级空间);三次旋转;环状旋转(中兴比赛复试)
no.217 存在重复元素 19.09.20 集合去重,对比长度;字典;排序后对比连续两个元素;Counter.most_common(1)>1?
no.136 只出现一次的数字 19.09.24 异或;数学法;哈希表记录;列表记录
no.350 两个数组的交集 II 19.09.23 双重循环对比;排序后双指针;计数法[num1,num2];Counter,与操作
no.66 加一 19.09.24 暴力计算;尾部对比(==9?)
no.283 移动零 19.09.24 倒序去0尾插0;覆盖后补0;双指针交换
no.1 两数之和 19.09.25 暴力解法(双重循环相加,超时);借助字典(注意重复出现的数字,可在索引值不同时直接输出)
no.36 有效的数独 19.09.26 构造三个list进行判断;所有相同数字的坐标存入字典中再进行判断使用哈希表/list,边建表边判断
no.48 旋转图像 19.09.27 转置后每行倒序;旋转四个矩形(主要理解for循环的起止)
no.344 反转字符串 19.09.29 直接交换
no.7 整数反转 19.09.29 利用list;不使用list直接整除、取模
no.387 字符串中的第一个唯一字符 19.09.29 利用Counter;find和rfind(先定义26字母的list;直接在原list上遍历)
no.242 有效的字母异位词 19.09.30 利用Counter;排序;桶记录(一个list入,一个list出)
no.125 验证回文串 19.09.30 转小写正则匹配英文数字,指针遍历;str.isalnum转小写,反转对比
no.8 字符串转换整数 19.10.08 常规解法;正则表达式匹配
no.28 实现strStr() 19.10.10 暴力切片对比;SundayKMF...
no.38 外观数列 19.10.10 模拟过程;递归正则+递归
no.14 最长公共前缀 19.10.11 纵向扫描;zip+set;字典序排序单词,比较第一个和最后一个;分治二分Trie
no.237 删除链表中的节点 19.10.11 直接删除即可
no.19 删除链表的倒数第N个节点 19.10.14 快慢指针
no.206 反转链表 19.10.14 头插法(迭代);递归
no.21 合并两个有序链表 19.10.15 迭代;递归
no.234 回文链表 19.10.16 借助数组;快慢指针取中点,旋转后半,对比;快慢指针取中点,旋转前边,对比
no.141 环形链表 19.10.17 hash表暂存;快慢指针;置空
no.98 验证二叉搜索树 19.10.18 递归;迭代;中序遍历迭代中序遍历递归
no.108 将有序数组转换为二叉搜索树 19.10.23 递归取中点构造二叉树
no.88 合并两个有序数组 19.10.23 新建数组,两个指针从前向后,新数组替换nums1;直接合并后排序;三指针(nums1上两个指针),从后向前
no.278 第一个错误的版本 19.10.24 从头开始循环;二分查找;改造魔术方法+bisect模块
no.70 爬楼梯 19.10.28 暴力递归(不使用lru_cache时超时);带缓存递归;动态规划;类斐波拉契;斐波拉契公式;binets
no.121 买卖股票的最佳时机 19.10.28 取最小值和最大利润,遍历每日进行更新;暴力法(每日计算利润,超时)
no.53 最大子序和 19.10.29 动态规划;分治法;暴力法
no.198 打家劫舍    
no.384 打乱数组    
no.155 最小栈    
no.412 Fizz Buzz    
no.204 计数质数    
no.326 3的幂    
no.13 罗马数字转整数    
no.191 位1的个数    
no.461 汉明距离    
no.190 颠倒二进制位    
no.118 杨辉三角    
no.20 有效的括号    
no.268 缺失数字    
编号 题目 时间 简要思路
no.104 二叉树的最大深度 20.07.28 递归,返回左右子树深度的最大值+1;层次遍历;dfs
no.2 两数相加 20.07.29 各数位直接相加,记录进位,利用其中一个链表存储结果,两链表长度不同则用0补充
面试题 08.03 魔术索引 20.07.31 直接遍历;跳着遍历(i=max(i+1,nums[i]))
no.632 最小区间 20.08.01 小顶堆,有k个数组则堆中有k个元素,循环维护堆中最大值,pop最小值相减,更新范围后将最小值所在的数组的下一元素push到堆中,直至pop出的最小值所在的数组无后续元素
no.1534 统计好三元组 20.08.02 暴力法(其中一个条件提前判断,剪枝)
no.1535 找出数组游戏的赢家 20.08.02 k大等于n时即为最大值,k小于n时模拟一轮遍历进行尝试
no.1536 排布二进制网格的最少交换次数 20.08.02 先看看每一行的末尾有几个0,然后按顺序遍历每一行,当该行末尾的0的个数大于等于target时,pop掉,答案加上该行idx,target-1,重新遍历,如果全部遍历找不到大于等于target的值,返回-1
no.415 字符串相加 20.08.03 补零,记录进位,遍历结束后若进位标记=1,继续添加“1”,倒序输出
no.207 课程表 20.08.04 实质是求有向图的拓扑排序,即该图是否为有向无环图,使用bfs,先找到入度为0的节点,入队,然后依次出队,出队时将以其作为前序节点的节点的入度减一,当某个节点的入度为0时,入队,重复上述过程,直至所有节点已经遍历完毕或没有入度为0的节点,再根据遍历节点的数量进行判断;使用dfs,以出度为切入点,首先记录临界表,遍历所有点,对每个点进行dfs遍历,记录访问情况,当遍历时访问的点的状态为搜索中时,说明图中存在环,此时返回false
no.198 打家劫舍 20.08.05 dp,记录当前屋子打劫与否的最大值(打劫当前屋,则不能打劫前一屋)和前一屋的结果
no.213 打家劫舍Ⅱ 20.08.05 dp,分成[:-1]和[1:]两种情况分别计算,取最大值
no.337 打家劫舍Ⅲ 20.08.05 dp,类似后序遍历,递归,同时返回左右子树包含根节点和不包含根节点的值的最大值
no.1262 可被三整除的最大和 20.08.06 dp,三种状态的相互转换,注意初始化时1和2的初值都应设置为无穷小,否则在更新时会出现错误
no.100 相同的树 20.08.07 递归,两棵树同时dfs,左子树与左子树比较,右子树与右子树比较,两者相与
no.1544 整理字符串 20.08.09 暴力,遇到同字母大小写,去掉之后重新遍历,直到没有需要去除的字母;借助栈,判断当前字符与栈顶元素是否互为大小写,若是,则pop栈顶,否则将当前元素入栈,遍历结束后输出栈内字符
no.1545 找出第N个二进制字符串中的第K位 20.08.09 按题目描述暴力;递归,根据mid和k的关系,每次都进行减半,若k在前半部分则直接递归,若在后半部分则逆序后取反递归(对k进行修改)
no.1546 和为目标值的最大数目不重叠非空子数组数目 20.08.09 暴力,二维dp记录所有子数组的和,并记录与target的相同的值的起止时间,按照结束时间升序排序,类似活动安排的方法进行取舍;前缀和+贪心,遍历数组,记录数组前i项的和,存入哈希表中,如果前i项和-target的值存在于哈希表中,说明前k项到前i项的和恰好等于target值,此时重置哈希表及前i项和,答案数目+1
no.696 计数二进制子串 20.08.10 滑窗,窗口为2,当窗口中两个值不同时,分别向两端扩张,记录次数;遍历字符串,计数连续的相同字符个数,当遇到不同的字符时,重新开始计数,并且当当前计数值小于等于之前字符的计数值时,ans+1(相当于相邻的两个不同字符的个数去最小值);查找替换“01”和“10”为“0.1”“1.0”,之后以“.”进行分割,获得每一个子串的len,ans为每两个相邻子串长度的最小值之和
no.130 被围绕的区域 20.08.11 遍历边缘的所有元素,记录“O”所在的位置,并向四个方向进行dfs或bfs遍历,并记录其中“O”的位置,最后将所有被记录的位置以外的值全部改为“X”
no.133 克隆图 20.08.12 使用dict记录每个节点的备份,使用dfs或bfs遍历整个无向图,其中dfs应该在添加neighbors时递归,bfs是依次对每个节点的相邻节点进行更新,并加入队列
no.43 字符串相乘 20.08.14 逐位相乘,记录到相应的位置,倒序遍历记录的结果,进行进位操作
no.20 有效的括号 20.08.14 使用字典记录括号的对应关系,将左括号压入栈中,遇到右括号弹出栈顶元素,检测是否匹配,不匹配或栈为空则返回false
no.733 图像渲染 20.08.18 使用栈或队列保存与当前点相邻且颜色值与初始坐标相同的四个点的坐标,不断弹出压入,直至栈或队列为空
no.109 有序链表转换二叉搜索树 20.08.18 使用快慢指针获取根节点,递归建树
no.111 二叉树的最小深度 20.08.21 dfs,判断左子树或右子树是否为0,若为0取另一子树,否则取最小值+1;bfs,队列存储节点即层数,若某节点左右子树都为空,返回该节点所在层数

高亮表示还需要巩固理解,巩固后若还有难度,使用斜体标记

ac酱

to be continued


下一篇 python中的赋值

Comments

Content