NearTheSeas / algorithm

刷题记录

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

算法

前置

切题

  • Clarification 明确题目要求
  • Possible solutions 所有可能解法
    • compare (time/space)
    • optimal 最优
  • Coding
  • Test cases

五遍刷题

  • 第一遍
    • 5-10 分钟:读题 + 思考
    • 有思路:开始做和写代码 或 直接看解法:多解法,比较解法优劣
    • 默写背诵
  • 第二遍
    • 马上自己写 → LeetCode 提交
    • 多种解法比较、体会 → 优化
  • 第三遍
    • 24 小时后,再重复做题
    • 不同解法的熟练程度 → 专项练习
  • 第四遍
    • 一周后:反复回来练习相同的题目
  • 第五遍
    • 面试前一周恢复性训练

时间复杂度:

  • 树的遍历:前、中、后 O(n)
  • 图的遍历:O(n)
  • 搜索算法:DFS、BFS O(n)
  • 二分查找:O(logn)

跳表:

  • 升维**
  • 空间换时间
  • 多级索引 增加 log2n 个级索引
  • 时间复杂度 logn
  • 维护成本较高

数组、链表、跳表

栈、队列、优先队列、双端队列

哈希表、映射、集合

  • 49 异位词
  • 242 有效的字母异位词
  • 641 实现双端队列

树、二叉树、二叉搜索树

  • 94 二叉树中序遍历
  • 144 二叉树前序遍历
  • 429 N 叉树的层序遍历
  • 589 N 叉树的前序遍历
  • 590 N 叉树的后序遍历

泛型递归、树的递归

  • 70 爬楼梯
  • 22 括号生成 ※
    1. 翻转二叉树
    1. 验证二叉搜索树
    1. 二叉树的最大深度
    1. 二叉树的最小深度 ※
    1. 二叉树的序列化与反序列化 ※

分治、回溯

    1. Pow(x, n)
    1. 子集
    1. 多数元素
    1. 电话号码的字母组合 ※
    1. N 皇后 ※

深度优先搜索和广度优先搜索

岛屿系列问题

  • 200 岛屿数量
    1. 岛屿的周长
    1. 岛屿的最大面积
    1. 最大人工岛

贪心算法 部分题目增加了测试用例,不能使用贪心

    1. 零钱兑换 ※
    1. 柠檬水找零
    1. 买卖股票的最佳时机 II
    1. 分发饼干
    1. 模拟行走机器人 ※※
    1. 跳跃游戏
    1. 跳跃游戏 II ※

二分查找

单调性 上下界 索引访问

    1. x 的平方根
    1. 有效的完全平方数
    1. 搜索旋转排序数组 ※
    1. 搜索二维矩阵
    1. 寻找旋转排序数组中的最小值 ※

动态规划 ※※※※※※

    1. 最长有效括号 ※
    1. 跳跃游戏 II ※ 边界问题
    1. 最大子序和
    1. 跳跃游戏
    1. 不同路径 √ dp 初始化方式
    1. 不同路径 II ※※ 需要重点讨论障碍物的情况
    1. 最小路径和 ※ 初始状态 dp[0][i] dp[i][0]
    1. 编辑距离
    1. 爬楼梯
    1. 最小覆盖子串 ※ 滑动窗口
    1. 最大矩形 ※ 转换为 84 题
    1. 解码方法 ※ s[i] s[i-1] 是否为'0' dp[i] dp[i-1] dp[i-2]
    1. 不同的子序列 ※※
    1. 乘积最大子数组 ※
    1. 打家劫舍 ※ dp[0] dp[1],滚动数组空间优化
    1. 三角形最小路径和 ※ bottom to up 解法很精妙
    1. 买卖股票的最佳时机 ※
    1. 买卖股票的最佳时机 II ※
    1. 买卖股票的最佳时机 III ※
    1. 买卖股票的最佳时机 IV ※※
    1. 完全平方数 ※※ 背包/零钱问题的转化
    1. 打家劫舍 II ※ robRange
    1. 最大正方形 ※ 递推关系的证明?
    1. 最长递增子序列 ※ dp + 二分
    1. 最佳买卖股票时机含冷冻期 ※※※
    1. 戳气球 ※※ https://leetcode-cn.com/circle/article/qiAgHn/
    1. 零钱兑换 ※※※ 细节
    1. 俄罗斯套娃信封问题
    1. 矩形区域不超过 K 的最大数值和 ???
    1. 青蛙过河 ???
    1. 分割数组的最大值 ??? dp 按照长度、前缀,枚举最后一个划分 二分枚举可能的最大值
    1. 最长回文子序列 ※
    1. 零钱兑换 II ※ 题解中 排列和组合的对比
    1. 学生出勤记录 II ※※
    1. 任务调度器 ※※
    1. 回文子串 ※※ 中心点的枚举数量, left,right 计算方式
    1. 买卖股票的最佳时机含手续费 ※
    1. 使用最小花费爬楼梯
    1. 赛车 ???
    1. 不同路径 III ※※※
    1. 最长公共子序列 ※ 考虑为什么取值范围是 m+1,n+1

字典树和并查集

    1. 实现 Trie ※ (前缀树)
  • 212 单词搜索 trie + 回溯
  • 200 岛屿数量
    1. 被围绕的区域 以边界上的 O 为起点遍历
    1. 省份数量 ※

高级搜索 剪枝 双向 BFS 启发式搜索(Heuristic Search )

    1. 括号生成
    1. 有效的数独 ※
    1. 解数独 ※
    1. N 皇后
    1. 爬楼梯
    1. 单词接龙
    1. 最小基因变化
    1. 滑动谜题
    1. 二进制矩阵中的最短路径

红黑树和 AVL 树

  • 概念理解

位运算

https://leetcode-cn.com/problems/power-of-two/solution/2de-mi-by-leetcode-solution-rny3/

    1. N 皇后
    1. N 皇后 II
    1. 颠倒二进制位 ※
    1. 位 1 的个数
    1. 2 的幂 ※
    1. 比特位计数

布隆过滤器和 LRU 缓存 LFU

排序算法

  • 选择排序、插入排序、冒泡排序
  • 快排、归并
  • 堆排序
  • 计数排序、桶排序、基数排序
  • 56 合并区间
  • 242 有效的字母异位词
    1. 翻转对 逆序对 归并排序 ※
    1. 数组的相对排序 ※※ python sort(cmp=None, key=None, reverse=False) 参数学习
  • 1244 ?

字符串算法

字符串基础

    1. 字符串转换整数 (atoi)
    1. 字符串相乘
    1. 最后一个单词的长度 倒序查找
    1. 字符串中的第一个唯一字符
    1. 转换成小写字母 ※ chr ord 32 65 90
    1. 宝石与石头

字符串操作

  • 14 最长公共前缀
    1. 翻转字符串里的单词
    1. 反转字符串
    1. 反转字符串 II
    1. 反转字符串中的单词 III
    1. 仅仅反转字母 ※

异位词问题

回文串问题

    1. 最长回文子串
    1. 验证回文串 ※ isalnum 判断是否字符或数字
    1. 验证回文字符串 Ⅱ ※

最长子串、子序列问题

    1. 最长回文子串
    1. 编辑距离
    1. 最长公共子序列

字符串 +DP 问题

    1. 正则表达式匹配 ※※※
    1. 通配符匹配 ※
    1. 不同的子序列 ※
    1. 最长有效括号 ※
    1. 同构字符串 ※

确定有限状态机

    1. 有效数字 ???
    1. UTF-8 编码验证 ※

前缀和相关题目

    1. 区域和检索 - 数组不可变
    1. 二维区域和检索 - 矩阵不可变 ※
    1. 矩形区域不超过 K 的最大数值和 ※※ ???

二分

    1. 爱吃香蕉的珂珂
    1. 制作 m 束花所需的最少天数 ※
    1. 在 D 天内送达包裹的能力 ※
    1. 两球之间的磁力 ※※

滑动窗口

    1. 无重复字符的最长子串
    1. 最小覆盖子串
    1. 找到字符串中所有字母异位词
    1. 字符串的排列

背包问题 416. 分割和子集 474. 一和零 494. 目标和 879. 盈利计划 1049. 最后一块石头的重量 ii

    1. 数位成本和为目标值的最大数字
    1. 零钱兑换
    1. 零钱兑换 ii
    1. 完全平方数

labuladong 的算法小抄

动态规划

    1. 斐波那契数
    1. 最长递增子序列
    1. 俄罗斯套娃信封问题
    1. 最大子序和
    1. 最长公共子序列
    1. 编辑距离
    1. 最长回文子串
    1. 最长回文子序列 ※
    1. 让字符串成为回文串的最少插入次数
    1. 正则表达式匹配 ※※※
    1. 四键键盘 vip ※
    1. 鸡蛋掉落 ※
    1. 戳气球 ※※
    1. 分割等和子集
    1. 零钱兑换 II ※
    1. 打家劫舍
    1. 打家劫舍 II ※ robRange
    1. 打家劫舍 III
    1. 目标和

数据结构

  • 146 LRU 缓存机制
    1. LFU 缓存 ※
    1. 验证二叉搜索树
    1. 恢复二叉搜索树 ※※
    1. 相同的树
    1. 删除二叉搜索树中的节点 ※
    1. 二叉搜索树中的搜索
    1. 二叉搜索树中的插入操作 ※
  • 105 从前序与中序遍历序列构造二叉树
  • 124 二叉树中的最大路径和
    1. 完全二叉树的节点个数
    1. 二叉树的序列化与反序列化
    1. 二叉树的最近公共祖先 ※
    1. 下一个更大元素 I
    1. 下一个更大元素 II ※
    1. 滑动窗口最大值
    1. 回文链表
  • 206 反转链表
    1. 反转链表 II ※
    1. K 个一组翻转链表

算法思维

    1. 子集 ※
    1. 组合
  • 46 全排列
    1. 解数独 ※
  • 22 括号生成 ※
    1. 滑动谜题 ※
    1. 一月有多少天
    1. 两数之和
    1. 两数之和 III 数据结构设计
    1. 两数之和 II - 输入有序数组
  • 15 三数和
    1. 四数之和
    1. 基本计算器
    1. 基本计算器 II
    1. 基本计算器 iii
    1. 煎饼排序
    1. 和为 K 的子数组
    1. 扁平化嵌套列表迭代器

高频面试

    1. 计数质数 ※
    1. 超级次方 ※
    1. 二分查找
    1. 在排序数组中查找元素的第一个和最后一个位置
    1. 爱吃香蕉的珂珂
  • 42 接雨水 ※
    1. 删除排序链表中的重复元素
    1. 最长回文子序列 ※
    1. 跳跃游戏
    1. 跳跃游戏 II ※
  • 56 合并区间
    1. 无重叠区间
    1. 用最少数量的箭引爆气球
  • 20 有效的括号
    1. 考场就座 ※
    1. 等式方程的可满足性
    1. Nim 游戏
    1. 石子游戏
    1. 灯泡开关
    1. 打开转盘锁

剑指 Offer

  • 剑指 Offer 03. 数组中重复的数字
  • 剑指 Offer 04. 二维数组中的查找
  • 剑指 Offer 05. 替换空格
  • 剑指 Offer 06. 从尾到头打印链表
  • 剑指 Offer 07. 重建二叉树 ※※
  • 剑指 Offer 09. 用两个栈实现队列
  • 剑指 Offer 10- I. 斐波那契数列 ※
  • 剑指 Offer 10- II. 青蛙跳台阶问题 ※
  • 剑指 Offer 11. 旋转数组的最小数字 ※※※
  • 剑指 Offer 12. 矩阵中的路径 ※※※※※
  • 剑指 Offer 13. 机器人的运动范围 ※※
  • 剑指 Offer 14- I. 剪绳子 ???
  • 剑指 Offer 14- II. 剪绳子 II ???
  • 剑指 Offer 15. 二进制中 1 的个数 ※
  • 剑指 Offer 16. 数值的整数次方 ※※
  • 剑指 Offer 17. 打印从 1 到最大的 n 位数 ※※※
  • 剑指 Offer 18. 删除链表的节点 ※※
  • 剑指 Offer 19. 正则表达式匹配 ※※※※※※
  • 剑指 Offer 20. 表示数值的字符串 ???放弃了
  • 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
  • 剑指 Offer 22. 链表中倒数第 k 个节点
  • 剑指 Offer 25. 合并两个排序的链表
  • 剑指 Offer 26. 树的子结构 ※
  • 剑指 Offer 27. 二叉树的镜像 ※※※
  • 剑指 Offer 28. 对称的二叉树 ※
  • 剑指 Offer 29. 顺时针打印矩阵 ※
  • 剑指 Offer 30. 包含 min 函数的栈 ※※※
  • 剑指 Offer 31. 栈的压入、弹出序列 ※
  • 剑指 Offer 32 - I. 从上到下打印二叉树
  • 剑指 Offer 32 - II. 从上到下打印二叉树 II ※
  • 剑指 Offer 32 - III. 从上到下打印二叉树 III ※※※
  • 剑指 Offer 33. 二叉搜索树的后序遍历序列 ※※※※
  • 剑指 Offer 34. 二叉树中和为某一值的路径 ※※※※
  • 剑指 Offer 35. 复杂链表的复制 ※
  • 剑指 Offer 36. 二叉搜索树与双向链表 ※※※※
  • 剑指 Offer 37. 序列化二叉树
  • 剑指 Offer 38. 字符串的排列 ※※
  • 剑指 Offer 39. 数组中出现次数超过一半的数字
  • 剑指 Offer 40. 最小的 k 个数 ※※※※
  • 剑指 Offer 41. 数据流中的中位数 ※※※※
  • 剑指 Offer 42. 连续子数组的最大和
  • 剑指 Offer 43. 1 ~ n 整数中 1 出现的次数 ???
  • 剑指 Offer 44. 数字序列中某一位的数字 ???
  • 剑指 Offer 45. 把数组排成最小的数 ※※※※
  • 剑指 Offer 46. 把数字翻译成字符串
  • 剑指 Offer 47. 礼物的最大价值
  • 剑指 Offer 48. 最长不含重复字符的子字符串 ※※
  • 剑指 Offer 49. 丑数 ※※※
  • 剑指 Offer 50. 第一个只出现一次的字符
  • 剑指 Offer 51. 数组中的逆序对 ※※※※
  • 剑指 Offer 52. 两个链表的第一个公共节点 ※※
  • 剑指 Offer 53 - I. 在排序数组中查找数字 I
  • 剑指 Offer 53 - II. 0 ~ n-1 中缺失的数字 ※※
  • 剑指 Offer 54. 二叉搜索树的第 k 大节点 ※※
  • 剑指 Offer 55 - I. 二叉树的深度
  • 剑指 Offer 55 - II. 平衡二叉树 ※※
  • 剑指 Offer 56 - I. 数组中数字出现的次数 ※※※※
  • 剑指 Offer 56 - II. 数组中数字出现的次数 II ※※※※
  • 剑指 Offer 57. 和为 s 的两个数字 ※※※※
  • 剑指 Offer 57 - II. 和为 s 的连续正数序列 ※※※※
  • 剑指 Offer 58 - I. 翻转单词顺序 ※※
  • 剑指 Offer 58 - II. 左旋转字符串
  • 剑指 Offer 59 - I. 滑动窗口的最大值 ※※
  • 剑指 Offer 59 - II. 队列的最大值 ※※
  • 剑指 Offer 60. n 个骰子的点数 ???
  • 剑指 Offer 61. 扑克牌中的顺子 ※※※※
  • 剑指 Offer 62. 圆圈中最后剩下的数字 ???
  • 剑指 Offer 63. 股票的最大利润 ※
  • 剑指 Offer 64. 求 1+2+…+n ※※※※
  • 剑指 Offer 65. 不用加减乘除做加法 ???
  • 剑指 Offer 66. 构建乘积数组 ※※※※
  • 剑指 Offer 67. 把字符串转换成整数 ???
  • 剑指 Offer 68 - I. 二叉搜索树的最近公共祖先 ※※※※
  • 剑指 Offer 68 - II. 二叉树的最近公共祖先 ※※※※

剑指 Offer 专项训练

正数

  • 剑指 Offer II 001. 整数除法
  • 剑指 Offer II 002. 二进制加法
  • 剑指 Offer II 003. 前 n 个数字二进制中 1 的个数
  • 剑指 Offer II 004. 只出现一次的数字 ?
  • 剑指 Offer II 005. 单词长度的最大乘积

数组

  • 剑指 Offer II 006. 排序数组中两个数字之和
  • 剑指 Offer II 007. 数组中和为 0 的三个数 ※
  • 剑指 Offer II 008. 和大于等于 target 的最短子数组
  • 剑指 Offer II 009. 乘积小于 K 的子数组 ※
  • 剑指 Offer II 010. 和为 k 的子数组
  • 剑指 Offer II 011. 0 和 1 个数相同的子数组 ※
  • 剑指 Offer II 012. 左右两边子数组的和相等
  • 剑指 Offer II 013. 二维子矩阵的和 ※

字符串

  • 剑指 Offer II 014. 字符串中的变位词 ※
  • 剑指 Offer II 015. 字符串中的所有变位词
  • 剑指 Offer II 016. 不含重复字符的最长子字符串
  • 剑指 Offer II 017. 含有所有字符的最短字符串
  • 剑指 Offer II 018. 有效的回文
  • 剑指 Offer II 019. 最多删除一个字符得到回文
  • 剑指 Offer II 020. 回文子字符串的个数

链表

  • 剑指 Offer II 021. 删除链表的倒数第 n 个结点 ※※
  • 剑指 Offer II 022. 链表中环的入口节点 ※※※
  • 剑指 Offer II 023. 两个链表的第一个重合节点
  • 剑指 Offer II 024. 反转链表
  • 剑指 Offer II 025. 链表中的两数相加
  • 剑指 Offer II 026. 重排链表 ※※
  • 剑指 Offer II 027. 回文链表 ※
  • 剑指 Offer II 028. 展平多级双向链表 ※※※
  • 剑指 Offer II 029. 排序的循环链表 ※

哈希表

  • 剑指 Offer II 030. 插入、删除和随机访问都是 O(1) 的容器 ※
  • 剑指 Offer II 031. 最近最少使用缓存
  • 剑指 Offer II 032. 有效的变位词
  • 剑指 Offer II 033. 变位词组
  • 剑指 Offer II 034. 外星语言是否排序 ※
  • 剑指 Offer II 035. 最小时间差 v

  • 剑指 Offer II 036. 后缀表达式
  • 剑指 Offer II 037. 小行星碰撞 ?
  • 剑指 Offer II 038. 每日温度
  • 剑指 Offer II 039. 直方图最大矩形面积
  • 剑指 Offer II 040. 矩阵中最大的矩形

队列

  • 剑指 Offer II 041. 滑动窗口的平均值
  • 剑指 Offer II 042. 最近请求次数
  • 剑指 Offer II 043. 往完全二叉树添加节点 ※
  • 剑指 Offer II 044. 二叉树每层的最大值
  • 剑指 Offer II 045. 二叉树最底层最左边的值
  • 剑指 Offer II 046. 二叉树的右侧视图

  • 剑指 Offer II 047. 二叉树剪枝 ※
  • 剑指 Offer II 048. 序列化与反序列化二叉树 ※
  • 剑指 Offer II 049. 从根节点到叶节点的路径数字之和 ※※※
  • 剑指 Offer II 050. 向下的路径节点之和 ※※※
  • 剑指 Offer II 051. 节点之和最大的路径
  • 剑指 Offer II 052. 展平二叉搜索树 ※
  • 剑指 Offer II 053. 二叉搜索树中的中序后继 ※※
  • 剑指 Offer II 054. 所有大于等于节点的值之和
  • 剑指 Offer II 055. 二叉搜索树迭代器 ※※
  • 剑指 Offer II 056. 二叉搜索树中两个节点之和
  • 剑指 Offer II 057. 值和下标之差都在给定的范围内 ?
  • 剑指 Offer II 058. 日程表 ?

  • 剑指 Offer II 059. 数据流的第 K 大数值 ?
  • 剑指 Offer II 060. 出现频率最高的 k 个数字 ?
  • 剑指 Offer II 061. 和最小的 k 个数对 ??

前缀树

  • 剑指 Offer II 062. 实现前缀树
  • 剑指 Offer II 063. 替换单词 ?
  • 剑指 Offer II 064. 神奇的字典 ??
  • 剑指 Offer II 065. 最短的单词编码
  • 剑指 Offer II 066. 单词之和
  • 剑指 Offer II 067. 最大的异或 ?

二分 offer

  • 剑指 Offer II 068. 查找插入位置 ※
  • 剑指 Offer II 069. 山峰数组的顶部
  • 剑指 Offer II 070. 排序数组中只出现一次的数字 ※
  • 剑指 Offer II 071. 按权重生成随机数 ※※※
  • 剑指 Offer II 072. 求平方根
  • 剑指 Offer II 073. 狒狒吃香蕉

排序

  • 剑指 Offer II 074. 合并区间
  • 剑指 Offer II 075. 数组相对排序 ※
  • 剑指 Offer II 076. 数组中的第 k 大的数字 ※
  • 剑指 Offer II 077. 链表排序 ※※
  • 剑指 Offer II 078. 合并排序链表 ※

回溯法

  • 剑指 Offer II 079. 所有子集
  • 剑指 Offer II 080. 含有 k 个元素的组合
  • 剑指 Offer II 081. 允许重复选择元素的组合 ※※※
  • 剑指 Offer II 082. 含有重复元素集合的组合 ※
  • 剑指 Offer II 083. 没有重复元素集合的全排列 ※
  • 剑指 Offer II 084. 含有重复元素集合的全排列
  • 剑指 Offer II 085. 生成匹配的括号
  • 剑指 Offer II 086. 分割回文子字符串 ※※※
  • 剑指 Offer II 087. 复原 IP ※※※

动态规划 offer

  • 剑指 Offer II 088. 爬楼梯的最少成本 ※
  • 剑指 Offer II 089. 房屋偷盗
  • 剑指 Offer II 090. 环形房屋偷盗
  • 剑指 Offer II 091. 粉刷房子
  • 剑指 Offer II 092. 翻转字符 ※※※※
  • 剑指 Offer II 093. 最长斐波那契数列 ※※※※
  • 剑指 Offer II 094. 最少回文分割 ※※※※
  • 剑指 Offer II 095. 最长公共子序列
  • 剑指 Offer II 096. 字符串交织 ※※※※
  • 剑指 Offer II 097. 子序列的数目 ※※
  • 剑指 Offer II 098. 路径的数目
  • 剑指 Offer II 099. 最小路径之和
  • 剑指 Offer II 100. 三角形中最小路径之和 https://leetcode-cn.com/problems/combination-sum-iv/solution/xi-wang-yong-yi-chong-gui-lu-gao-ding-bei-bao-wen-/
  • 剑指 Offer II 101. 分割等和子集 ※※※
  • 剑指 Offer II 102. 加减的目标值 ※※※
  • 剑指 Offer II 103. 最少的硬币数目 ※※※
  • 剑指 Offer II 104. 排列的数目 ※※※

  • 剑指 Offer II 105. 岛屿的最大面积
  • 剑指 Offer II 106. 二分图 ※※※
  • 剑指 Offer II 107. 矩阵中的距离 ※※※
  • 剑指 Offer II 108. 单词演变
  • 剑指 Offer II 109. 开密码锁
  • 剑指 Offer II 110. 所有路径 ※
  • 剑指 Offer II 111. 计算除法 ※※※
  • 剑指 Offer II 112. 最长递增路径 ※※
  • 剑指 Offer II 113. 课程顺序 ※
  • 剑指 Offer II 114. 外星文字典
  • 剑指 Offer II 115. 重建序列
  • 剑指 Offer II 116. 省份数量
  • 剑指 Offer II 117. 相似的字符串
  • 剑指 Offer II 118. 多余的边
  • 剑指 Offer II 119. 最长连续序列

每日一题

    1. 数组中最大数对和的最小值
    1. 复制带随机指针的链表
    1. 检查是否区域内所有整数都被覆盖 ※※ 差分数组 前缀和
    1. 得到子序列的最少操作次数 ???
    1. 二叉树中第二小的节点
    1. 二叉树中所有距离为 K 的结点 ※ 构建父节点关系 图
    1. 二叉树寻路 ???
    1. 有效三角形的个数 ※
    1. 字符串相乘

Microsoft-Hiring

todo

Microsoft-Hiring:一个微软HR做的网站,一些微软介绍以及题目 题目列表

共241道题 日均2~3道题 4个月内完成?

need vip

LeetCode

About

刷题记录


Languages

Language:Python 86.8%Language:JavaScript 13.2%