按照数据结构
数组
- leetcode:27. 移除元素
- leetcode:747. 至少是其他数字两倍的最大数
- leetcode:830. 较大分组的位置
- leetcode:717. 1 比特与 2 比特字符
- leetcode:977. 有序数组的平方
- leetcode:1431. 拥有最多糖果的孩子
- leetcode:209. 长度最小的子数组
- leetcode:849. 到最近的人的最大距离
- leetcode:59. 螺旋矩阵 II
- leetcode:724 | 1991. 寻找数组的中心下标
- leetcode:704. 二分查找
- leetcode:74. 搜索二维矩阵
- leetcode:240. 搜索二维矩阵 II
- leetcode:153. 寻找旋转排序数组中的最小值
- leetcode:154. 寻找旋转排序数组中的最小值 II
- leetcode:33. 搜索旋转排序数组
- leetcode:414. 第三大的数
- leetcode:581. 无序数组中需要排序的最短子数组长度
- leetcode:605. 种花问题
- leetcode:628. 三个数的最大乘积
- leetcode:643. 子数组最大平均数 I
- leetcode:697. 数组的度
- leetcode:665. 非递减数列
- leetcode:300. 最长递增子序列
链表
- 算法:什么是链表
- 算法:如何写出正确的链表代码
- 算法:打印两个有序链表的公共部分
- leetcode:面试题06. 从尾到头打印链表
- leetcode:876. 返回链表的中点 middle-of-the-linked-list
- leetcode:剑指 Offer 22. | 面试题 02.02 返回链表中倒数第k个节点 lian-biao-zhong-dao-shu-di-kge-jie-dian-lcof
- leetcode | 剑指 Offer 18. 删除链表等于某个值节点
- leetcode:203.删除链表等于指定值的节点
- leetcode:237. |剑指 Offer 18. |面试题 02.03 删除链表指定地址的节点(毁尸灭迹)-easy
- leetcode:83. 删除排序链表中的重复元素 remove-duplicates-from-sorted-list
- leetcode:82.删除排序链表中的重复元素 II remove-duplicates-from-sorted-list-ii
- leetcode:面试题 02.01. 删除未排序链表的重复节点 remove-duplicate-node-lcci
- leetcode:24. 两两交换链表中的节点
- leetcode:19. 删除链表的倒数第 N 个结点
- leetcode:160. | 面试题 02.07. |剑指 Offer 52. 两个链表的第一个公共节点
- leetcode:142. 返回环形单链表入环的第一个节点 II
- leetcode:206 反转链表 | 剑指 Offer 24反转链表
- leetcode:92. 反转部分单链表 II
- leetcode:234. |面试题 02.06 回文链表
- algorithm:将单链表按照某值划分成左边小,中间相等,右边大的形式
- leetcode:面试题 02.04. 将链表按照某个x值分割成两部分,小于x的在左边,大于等于x的在右边
- leetcode:86. 将链表按照某个x值分割成两部分,小于x的在左边,大于等于x的在右边,并保留原始位置
- leetcode:445. 两个单链表生成相加链表
哈希表
- leetcode:242. 有效的字母异位词
- leetcode:383. 赎金信
- leetcode:349. 两个数组的交集
- leetcode:202. 快乐数
- leetcode:1. 两数之和
- leetcode:15. 三数之和
- leetcode:18. 四数之和
- leetcode:454. 四数相加 II
字符串
- leetcode:344. 反转字符串
- leetcode:541. 反转字符串 II
- leetcode:151. 颠倒字符串中的单词 ⭐⭐⭐⭐⭐
- leetcode:28. 实现 strStr()
- leetcode:459. 重复的子字符串
双指针
栈
- 算法:如何理解“栈”
- 算法:使用栈完成后缀表达式求和
- 算法:使用栈实现后缀表达式转中缀表达式
- 算法:公式字符串求值
- 算法:栈模拟递归之求和
- 算法:栈模拟递归斐波那契数列
- 算法:Java使用数组实现栈
- 算法:golang实现数组栈
- 算法:Java使用栈模拟递归遍历目录
- leetcode: 155. 栈的最小值
- leetcode:xx. 用栈实现队列
- leetcode:225. 用队列实现栈
- leetcode:1047. 删除字符串中的所有相邻重复项
- leetcode:20. 有效的括号
- leetcode:1441. 用栈操作构建数组
队列
二叉树
- algorithm:什么是二叉树
- algorithm:二叉树的性质
- algorithm:递归以顺序二叉树的方式遍历数组
- leetcode:543. 二叉树的最大直径 diameter-of-binary-tree
- algorithm:统计二叉树的节点个数
- algorithm:二叉平衡树(AVL树)
- algorithm:线索二叉树
- algorithm:图解二叉树的遍历
- algorithm:二叉树的Morris遍历
- leetcode:144. 二叉树的先序遍历 Binary Tree Preorder Traversal
- leetcode:94. 二叉树的中序遍历 Binary Tree Inorder Traversal
- leetcode:145.二叉树的后序遍历 Binary Tree Postorder Traversal
- leetcode:剑指 Offer 32 - I. 二叉树的层序遍历(从上到下, 返回一维数组) cong-shang-dao-xia-da-yin-er-cha-shu-lcof
- leetcode:102.二叉树的层序遍历(从上到下, 返回二维数组)Binary Tree Level Order Traversal
- leetcode:107. 二叉树的层序遍历(从下到上, 返回二维数组) Binary Tree Level Order Traversal II
- leetcode:103. 二叉树的层序遍历(之字形, 返回二维数组) Binary Tree Zigzag Level Order Traversal
- leetcode:637. 二叉树的层平均值 Average of Levels in Binary Tree
- leetcode:314. 二叉树的竖直遍历( 返回二维数组) Binary Tree Vertical Order Traversal
- leetcode:199. 二叉树的右视图
- leetcode:515. 在每个树行中找最大值
- leetcode:116. Populating Next Right Pointers in Each Node填充每个节点的下一个右侧节点指针
- leetcode:117. Populating Next Right Pointers in Each Node II填充每个节点的下一个右侧节点指针 II
- leetcode:589. N叉树的前序遍历 N-ary Tree Preorder Traversal
- leetcode:590. N叉树的后序遍历 N-ary Tree Postorder Traversal
- leetcode:429. N叉树层序遍历 N-ary Tree Level Order Traversal
- leetcode:104. 二叉树的最大深度 Maximum Depth of Binary Tree
- leetcode:111.二叉树的最小深度 Minimum Depth of Binary Tree
- leetcode:559. N叉树的最大深度 Maximum Depth of N-ary Tree
- leetcode:617. 合并二叉树
- leetcode:100. 相同的树 Same Tree
- leetcode:101. 对称二叉树
- leetcode:226. 输出二叉树的翻转
- leetcode:951. 是不是翻转二叉树
- leetcode:剑指 Offer 26:判断t1中是否含有t2的全部拓扑结构 shu-de-zi-jie-gou-lcof
- leetcode:110. 判断二叉树是不是平衡二叉树 Balanced Binary Tree
- leetcode:958. 判断二叉树是不是完全二叉树 check-completeness-of-a-binary-tree
- algorithm:判断一棵树是不是满二叉树
- leetcode:222. 统计完全二叉树的节点个数 count-complete-tree-nodes
- leetcode:404. 左叶子之和
- leetcode:513. 找树左下角的值
- leetcode:257. 二叉树的所有路径 Binary Tree Paths
- leetcode:112. 二叉树中是否存在路径总和等于target的路径 (根节点到子节点)
- leetcode:113. 二叉树中所有路径总和等于target的路径(根节点到叶子节点)Path Sum II 💥💥💥💥💥
- leetcode:437. 二叉树的路径总和等于target的路径数目(不一定经过根节点,父节点到子节点) 💥💥💥💥💥
- leetcode:666. 路径总和
- leetcode:124. 二叉树的最大路径和(不一定穿过根节点,父节点到子节点) Binary Tree Maximum Path Sum
- leetcode:298. 二叉树最长连续序列(不一定穿过根节点,父节点到子节点) Binary Tree Longest Consecutive Sequence
- leetcode:654. 最大二叉树
- leetcode:105.由先序和中序遍历建立二叉树 Construct Binary Tree from Preorder and Postorder Traversal
- leetcode:106. 从中序与后序遍历序列构造二叉树 Construct Binary Tree from Inorder and Postorder Traversal
- leetcode:889. 由先序和后序遍历建立二叉树 Construct Binary Tree from Preorder and Postorder Traversal
- leetcode:98. 判断二叉树是不是二叉搜索树 Validate Binary Search Tree
- leetcode:700. 二叉搜索树中的搜索
- leetcode:701. 二叉搜索树中的插入操作
- leetcode:450. 删除二叉搜索树中的节点
- leetcode:669. 修剪二叉搜索树
- leetcode:530. 二叉搜索树的最小绝对差
- leetcode:501. 二叉搜索树中的众数
- leetcode:面试题68 - II. 二叉树的最近公共祖先 er-cha-shu-de-zui-jin-gong-gong-zu-xian-lcof
- leetcode:面试题68 - I. 二叉搜索树的最近公共祖先 lowest-common-ancestor-of-a-binary-search-tree
- leetcode:1123. 最深叶节点的最近公共祖先 lowest-common-ancestor-of-deepest-leaves
- leetcode:剑指 Offer 33. 根据后序数组重建二叉搜索树 er-cha-sou-suo-shu-de-hou-xu-bian-li-xu-lie-lcof
- leetcode:1008. 前序遍历构造二叉搜索树
- leetcode:108. 将有序数组转为高度最小的二叉搜索树 Convert Sorted Array to Binary Search Tree
- leetcode:109. 有序链表转换二叉搜索树 Convert Sorted List to Binary Search Tree
- leetcode:538. 把二叉搜索树转换为累加树
- 华为机试:二叉树中序遍历
- leetcode:1104. 完全二叉树寻路
- leetcode:993. 二叉树的堂兄弟节点
并查集
- 算法:并查集
- leetcode:128. 最长连续序列 Longest Consecutive Sequence
- leetcode:130. 被围绕的区域 Surrounded Regions
- leetcode:463. 岛屿的周长
- leetcode:200. 岛屿数量 Number of Islands
- leetcode:305. 岛屿的数量 number-of-islands-ii
- leetcode:934. 最短的桥
- leetcode:399. 除法求值Evaluate Division
- leetcode:547. 朋友圈 Friend Circles
- leetcode:684. 冗余连接(无向图)Redundant Connection
- leetcode:721. 账户合并 Accounts Merge
- leetcode:765. 情侣牵手.Couples Holding Hands
- leetcode:839. 相似字符串组 Similar String Groups
- leetcode:990. 等式方程的可满足性 Satisfiability of Equality Equations
- leetcode:1971. 寻找图中是否存在路径
- leetcode:803. 打砖块 bricks-falling-when-hit
- leetcode:952. 按公因数计算最大组件大小
- 778 . Swim in Rising Water
- 685 . Redundant Connection II
- 924 . Minimize Malware Spread
- 928 . Minimize Malware Spread II
- 947 . Most Stones Removed with
- 959 . Regions Cut By Slashes
递归
- 算法:如何正确理解递归
- 算法:递归的内部实现原理
- 算法:阶乘与递归树
- 算法:图解汉诺塔问题(递归求解)
- 算法:栈的逆序
- 算法:如何借助树来求解递归算法的时间复杂度?
- 算法:Java使用栈模拟递归遍历目录
- 算法:C++实现递归层次显示目录
- 算法:golang递归遍历目录和层级显示目录
- 算法:java递归以顺序二叉树的方式遍历数组
- 算法:栈模拟递归斐波那契数列
- 算法:栈模拟递归之求和
- 算法:用递归方法求数组中的最大值
- 算法:生成长度为size的达标数组
- 算法:step num
- C/C++编程:奇特的递归模板模式
- 设计模式:组合模式,如何设计实现支持递归遍历的文件系统目录树结构
- 华为机试:分糖果
回溯
- 算法:什么是回溯
- 算法:字符串全部子序列、子串、全排列
- 算法:皇后问题
- 算法:扑克牌问题
- leetcode:37. 解数独
- leetcode:77. 组合
- leetcode:216. 组合总和 III
- leetcode:17. 电话号码的字母组合
- leetcode:39. 组合总和
- leetcode:40. 组合总和 II
- leetcode:22. 括号生成
- leetcode:78. 子集
- leetcode:90. 子集 II
- leetcode:784. 字母大小写全排列
- leetcode:1755. 最接近目标值的子序列和
- leetcode:46. 全排列
- leetcode:47. 全排列 II
- leetcode:131. palindrome-partitioning 分割回文串
- leetcode:93. restore-ip-addresses 复原 IP 地址
- leetcode:491. increasing-subsequences 递增子序列
- leetcode:934. 最短的桥
- leetcode:332. 重新安排行程
贪心
- 算法:贪心算法
- 算法:一根长度为K的绳子,最多能盖住几个点
- 算法: 相邻字符的交换次数
- 算法:字符串组成的数组拼接后字典序最小的结果
- 算法:做项目能得到的最大利润
- 算法:每个人能获得的最好收入
- 算法:会议室问题
- 算法:居民楼路灯问题
- 算法:返回分割的最小代价
- leetcode:LCP 06. 拿硬币
- leetcode:455. assign-cookies分发饼干
- leetcode:135. 分发糖果
- leetcode:1005. maximize-sum-of-array-after-k-negations K次取反后最大化的数组和
- leetcode:122.best-time-to-buy-and-sell-stock-ii买卖股票的最佳时机II
图论
排序
- 算法:稳定排序与非稳定排序
- 算法:冒泡排序 ⭐⭐
- 算法:鸡尾酒排序
- 算法:奇偶排序
- 算法:梳子排序
- 算法:侏儒(地精)排序
- 算法:臭皮匠排序
- 算法:选择排序 ⭐⭐⭐⭐⭐
- 算法:直接插入排序 ⭐⭐⭐⭐⭐
- 算法:希尔(shell)排序
- 算法:睡眠排序
- 算法:计数排序入门
- 算法:什么是计数排序⭐
- 算法:什么是桶排序⭐
- 算法:什么是基数排序⭐
- 算法:荷兰国旗问题 ⭐⭐⭐⭐⭐
- 算法:什么是快速排序 ⭐⭐⭐⭐⭐
- 算法:归并排序理论 ⭐⭐⭐⭐⭐
- 算法:归并排序实现 ⭐⭐⭐⭐⭐
- 算法:归并排序面试高频题⭐⭐⭐⭐⭐
剑指offer
https://interviewguide.cn/notes/03-hunting_job/03-algorithm/02-sword-offer/60-%E5%89%91%E6%8C%87offer.html
刷题
脑筋急转弯
设计题
- 算法:请设计一个具有setAll功能的哈希表
- 算法:一种消息接收并打印的结构设置 :map + 链表
二分查找
-
算法:在两个有序数组中找整体第k小的数 ⭐⭐⭐⭐⭐
双指针
前缀树
-
算法:使用单词表拼接字符串的方法数 前缀树方法待研究
哈希函数
- 算法:哈希算法的应用场景
- 算法:哈希表的设计
- 算法:位图与布隆过滤器
- 算法:C/C++实现实现hash函数
- 算法:C/C++实现hashtable
- 算法:Java中HashMap实现原理
- C/C++编程:std::unordered_map使用总结
- C/C++编程:STL关联式容器源码学习
- redis面试:hash冲突怎么办
- 电商:MySQL存储海量数据的最后一招—分库分表
- 即时消息:如何保证消息的一致性
- redis面试:缓存雪崩、缓存击穿、缓存穿透
- C/C++编程:高性能开发有哪些常用的技术?
- leetcode:146. LRU最近最少使用 缓存
- leetcode:460. LFU最不常用缓存
区间问题
(假设我们有一个数组)针对不同的题目,我们有不同的方案可以选择(加粗字体为最佳方案):
- 数组不变、求区间和(即区间查询):前缀和、树状数组、线段树
- 频繁单点增减、求区间和(即区间查询):树状数组、线段树
- 频繁区间增减、输出数组&&单点查询:差分数组
- 频繁区间增减、求区间和(即区间查询):线段树、树状数组
- 频繁区间更新为同一个数、求区间和(即区间查询):线段树
这样看来,「线段树」能解决的问题是最多的,那我们是不是无论什么情况都写「线段树」呢?
答案并不是,而且恰好相反,只有在我们遇到第 4 类问题,不得不写「线段树」的时候,我们才考虑线段树。
因为「线段树」代码很长,而且常数很大,实际表现不算很好。我们只有在不得不用的时候才考虑「线段树」。
总结一下,我们应该按这样的优先级进行考虑:
- 简单求区间和,用「前缀和」
- 多次将某个区间变成同一个数,用「线段树」
- 其他情况,用「树状数组」
注意:上述总结是对于一般性而言的(能直接解决的),对标的是模板问题。
但存在经过一些经过“额外”操作,对问题进行转化,从而使用别的解决方案求解的情况。
例如某些问题,我们可以先对原数组进行差分,然后使用树状数组,也能解决区间修改问题。
或者使用多个树状数组来维护多个指标,从而实现类似线段树的持久化标记操作。
前缀和
- leetcode:724 | 1991. 寻找数组的中心下标
- leetcode:238. 除自身以外数组的乘积
- leetcode:303. 区域和检索 - 数组不可变
- leetcode:304 |剑指OfferII013. 二维区域和检索 - 矩阵不可变
- leetcode:560. 和为 K 的子数组的个数
-
leetcode:53. 子数组最大累加和 (分治法待研究)
线段树
差分数组
- 算法:差分数组
- leetcode:370. 区间加法 – 对数组区间多次修改,然后返回数组
- 1109. 航班预订统计
- 1094. 拼车
树状数组
区间
- leetcode:882. 用最少数量的箭引爆气球 minimum-number-of-arrows-to-burst-balloons — 重叠区间的个数
- leetcode:406.根据身高重建队列 queue-reconstruction-by-height
- leetcode:632. 最小区间
单调栈
- algorithm:单调栈
- leetcode:1856. 子数组最小乘积的最大值
- leetcode:907. 子数组的最小值之和
- leetcode:2104. 子数组范围和
- leetcode:84. 柱状图中最大的矩形
- leetcode:85. 全是1的最大子矩形面积
- leetcode:1504. 统计全 1 子矩形的个数
- leetcode:42. 接雨水
- leetcode:407. 接雨水 II
滑动窗口
- leetcode:239. 滑动窗口最大值
- leetcode:134. 加油站
- algorithm:加油站的良好出发点问题
- algorithm: 整形数组中子数组最大值减最小值达标的子数组个数
- algorithm:一根长度为K的绳子,最多能盖住几个点
- algorithm:最多同时可以有多少场比赛
- leetcode:933. 最近的请求次数
动态规划
-
leetcode:688. 骑士在棋盘上的概率 在棋盘上的概率
-
algorithm:必须走K步,Bob生还的概率 还活着的概率
-
algorithm:英雄砍死怪兽的概率 死亡的概率有点没有理清楚
-
algorithm:有特殊能力的蛇行矩阵,可以走任意步(随便停)时,能够获得的最大增长值 — 寻找业务限制的尝试模型⭐⭐⭐⭐⭐
-
leetcode:213. 打家劫舍 II ,一圈店家,能抢到的钱最多 · House Robber II 从左到右尝试模型
-
algorithm:一组灯,最少按几次开关才能点亮所有的灯从左到右尝试模型
-
algorithm:一圈灯,最少按几次开关才能点亮所有的灯从左到右尝试模型
-
algorithm:怎么均分司机到AB区域使得总收入最高从左到右尝试模型
-
algorithm:0-1背包问题从左到右尝试模型
-
algorithm:国王与金矿 从左到右尝试模型
-
lintcode:92 背包最大能装多满 (每个物品只用一次) 从左到右尝试模型
-
lintcode:440 能装入背包的最大价值 (每个物品无限次) 从左到右尝试模型
-
lintcode:562 · 能装满背包的方案数量(每个物品无限次) 从左到右尝试模型
-
lintcode:563 能装满背包的方案数量(每个物品只用一次) 从左到右尝试模型
-
lintcode:798 最多能买多少公斤的大米 从左到右尝试模型
-
lintcode:800 · 至少能获得一所大学的可能性 从左到右尝试模型
-
leetcode:801 · 最少需要给商人多少小费 从左到右尝试模型
-
algorithm:正数数组的子集不能累加出的最小正数从左到右尝试模型
-
leetcode:330. 按要求补齐数组 和上面的题目类似
-
leetcode:416. 分割等和子集 从左到右尝试模型
-
algorithm:正数数组分割为累加和接近的两个集合从左到右尝试模型
-
algorithm:正数数组分割为个数跟累加和接近的两个集合从左到右尝试模型
-
algorithm:有负数的无序数组的子集能否累加出K从左到右尝试模型,分治
-
leetcode:1755. 最接近目标值的子序列和从左到右尝试模型, 分治⭐⭐⭐⭐⭐
-
leetcode:300 无序数组nums最长上升子序列 Longest Increasing Subsequence · 每个数都有要和不要两种选择,但是要求本次选取的数一定比之前选取的数大
-
leetcode:132. 分割字符串使得每个部分都是回文的最少切割次数 从左到右尝试模型
-
leetcode:139. Word Break · 单词拆分从左到右尝试模型
-
leetcode:剑指 Offer 60. n个骰子的点数, 每一个点数和出现的概率 — 从左到右尝试模型
-
leetcode:673. 无序数组nums形成的最长递增子序列的个数 number-of-longest-increasing-subsequence
-
leetcode:3.无重复字符的最长子串的长度 longest-substring-without-repeating-characters 必须以str[i]结尾的情况下,左侧最多能推多远,最长无重复
-
leetcode:413. 等差数列划分 arithmetic-slices 必须以nums[i]结尾的情况下,长度大于等于3的连续等差数列的个数
-
leetcode:32. 最长有效括号的长度 longest-valid-parentheses 、必须以str[i]位置结尾的情况下,往左最远能扩出多长
-
leetcode:516. 字符串s形成的最长回文子序列的长度 longest-palindromic-subsequence 范围尝试模型
-
leetcode:5. 字符串s形成的最长回文子串是什么 longest-palindromic-substring 范围尝试模型
-
leetcode:1312. 让字符串s成为回文串的最少插入次数 minimum-insertion-steps-to-make-a-string-palindrome 范围尝试模型
-
leetcode:730. 统计字符串s可以生成多少个不同回文子序列 count-different-palindromic-subsequences 范围尝试模型,从左到右尝试模型
-
leetcode:面试题 08.14. 布尔运算 范围尝试模型
-
leetcode:241. 为运算表达式设计优先级 范围尝试模型
-
algorithm:最后获胜者的分数 范围尝试模型
-
algorithm:二维矩阵可以走出的单词 —样本对应模型,遍历每一个起点,上下左右四个方向尝试看能否匹配
-
leetcode:97. s3是不是由s1和s2交错组成 Interleaving String样本对应模型,s1的前i个字符,和s2前j个字符,能否组成s3的前i+j个字符
-
leetcode:1143. 对于s1和s2能够形成的最长公共子序列的长度 Longest Common Subsequence 样本对应模型,s1的前i个字符,和s2的前j个字符,形成的最长公共子序列的长度
-
leetcode:10. 正则表达式匹配样本对应模型, str[si…]能不能被exp[ei…]匹配出来
-
剑指 Offer 19. 正则表达式匹配
-
leetcode:44. 通配符匹配 样本对应模型待研究
-
algorithm: 整数拆分的方法数待完成⭐⭐⭐⭐⭐
-
leetcode:343. integer-break 整数拆分 分拆数字i,可以得到的最大乘积,坐标型动态规划 待完成
-
leetcode:691. 贴纸拼词 ⭐⭐⭐⭐⭐
-
leetcode:72. 编辑距离 样本对应模型⭐⭐⭐⭐⭐
-
- 两个字符串的删除操作
-
leetcode:87. 扰乱字符串样本对应模型
-
leetcode:263. 丑数 — 判断是不是丑数。这不是动态规划,是下面题的前置
-
leetcode:264. 丑数 II — 返回第i个丑数
-
咖啡机,⭐⭐⭐⭐⭐
(2)序列型动态规划,重点
(2.1) 单序列型动态规划
(2.2)双序列动态规划
- 状态: f[i][j]表示第一个sequence的前i个数字/字符, 配上第二个sequence的前j个;
- 方程: f[i][j] = 研究第i个和第j个的匹配关系;
- 初始化: f[i][0]和f[0][i]; 答案: f[n][m], 其中n = s1.length(); m = s2.length();
- leetcode:1143. Longest Common Subsequence 最长公共子序列
- leetcode:72. Edit Distance 编辑距离
- leetcode:161.相隔为1的编辑距离
- leetcode:115. Distinct Subsequence 不同的子序列
(3)划分型动态规划,重点
- 状态: f[i]表示前i个元素的最大值; 方程: f[i] = 前i个元素里面选一个区间的最大值; 初始化: f[0]; 答案: f[n - 1]
- leetcode:279 perfect-squares 完全平方数
- leetcode:132. Palindrome Partitioning II 分割回文串 II
- leetcode:买卖股票
- lintcode:Maximum Subarray III 最大子数组 III
(4)区间型动态规划,重点
二叉树
-
algorithm:从节点A出发,可以向上、向下,沿途节点只能经过一次,到达B时的距离就是节点A和节点B之间的距离。求与A节点的距离是K的所有节点 (转为图的宽度优先遍历)
-
algorithm:从节点A出发,可以向上、向下,沿途节点只能经过一次,到达B时的距离就是节点A和节点B之间的距离。求二叉树节点的最大距离
-
leetcode:96. 给定一个n,统计可以生成的不同的二叉搜索树的个数 Unique Binary Search Trees
-
leetcode:95.给定一个n,返回能够生成的所有的二叉搜索树 II Unique Binary Search Trees II
-
leetcode:426.将二叉搜索树转化为排序的双向链表 convert-binary-search-tree-to-sorted-doubly-linked-list
-
leetcode:897.| 剑指 Offer II 052. 展平二叉搜索树(将树转换为单链表) Increasing Order Search Tree
-
leetcode:173. | 剑指 Offer II 055. 二叉搜索树迭代器 Binary Search Tree Iterator
-
leetcode:297. 二叉树的序列化与反序列化 Serialize and Deserialize Binary Tree
-
leetcode:255. 验证二叉搜索树的先序序列Verify Preorder Sequence in Binary Search Tree
-
leetcode:331. 验证二叉树的前序序列化 Verify Preorder Serialization of a Binary Tree
排序
-
算法:如何构建一个大根堆⭐⭐⭐⭐⭐
-
算法:堆排序 ⭐⭐⭐⭐⭐⭐⭐⭐⭐
-
算法:Trie字典(前缀)树 ⭐⭐⭐⭐⭐⭐
-
- 摆动排序II
- leetcode:21. 合并两个有序链表
- leetcode:23. Merge k Sorted Lists 合并k个有序链表
- leetcode:88. 合并两个有序数组
- leetcode:75. 颜色分类
- leetcode:148. 排序链表
- leetcode:215. Kth Largest Element in an Array 数组中第k大的数字
- leetcode:347. Top K Frequent Elements 前K个高频元素
- leetcode:387. First Unique Character in a String 字符串第一个不同字符
- leetcode:451. Sort Characters By Frequency 按频率排序字符
按照算法思维
贪心
-
leetcode:55. jump-game 跳跃游戏—移动下标每次取最大跳跃步数,最后得到整体最大覆盖范围,看是否能到终点
-
leetcode:45. jump-game II · 跳跃游戏 II — 以最小的步数增加最大的覆盖范围,直到覆盖范围覆盖了终点。
-
eetcode:882. minimum-number-of-arrows-to-burst-balloons 用最少数量的箭引爆气球
- 无重叠区间
- 最长数对链
https://xiaochen1024.com/courseware/60b4f11ab1aa91002eb53b18/61963ce5c1553b002e57bf14
按照数据结构
图
- 算法:图常见算法的实现
- leetcode:797. 所有可能的路径
- leetcode:997. 找到小镇的法官
- leetcode:1791. 找出星型图的中心节点
- leetcode:1971. 寻找图中是否存在路径
- leetcode:LCP 07. 传递信息
- leetcode:133. 克隆图 Clone Graph
- lintcode:127 · 拓扑排序
- leetcode:207. 课程表 Course Schedule
- leetcode:210. 课程表 II Course Schedule II
- leetcode:310. 最小高度树 Minimum Height Trees ,剥洋葱
- leetcode:743. 网络延迟时间
链表
链表所有的简单题都做完了
数组&&字符串
字符串可以看成是一种特殊的一维数组
一维数组(查找)
找到满足某条性质的数
- leetcode:11. 盛最多水的容器
- leetcode:15. 三数之和
- leetcode:16. 最接近的三数之和
- leetcode:18. 四数之和
- leetcode:31. 下一个排列
- 算法:非常频繁的数据查询
二维数组
子串&&子序列
-
leetcode:674 longest-continuous-increasing-subsequence 最长上升连续子序列的长度 , 子串
-
leetcode:300 Longest Increasing Subsequence · 最长上升子序列 – 子序列 , 序列dp
-
leetcode:673. number-of-longest-increasing-subsequence最长递增子序列的个数 – 子序列 , 序列dp
-
leetcode:696. count-binary-substrings 计数二进制子串 – 子串 , 坐标型dp
-
leetcode:3.longest-substring-without-repeating-characters 无重复字符的最长子串的长度 — 子串、动态规划方法待研究
-
leetcode:647. palindromic-substrings 回文子串 – 子串(所有回文子串的数目)、区间型动态规划
-
leetcode:5. longest-palindromic-substring 最长回文子串 - 子串、区间型动态规划
-
leetcode:9. palindrome-number 回文数 – 当前数字是不是回文数 – 子串、递归
-
leetcode:125. valid-palindrome 验证回文串 — 当前字符串是不是回文数 – 子串、递归
栈
- leetcode:301. 删除无效的括号
- leetcode:772. 公式字符串求值
-
- 字符串解码
-
- 原子的数量
位运算
待做的题目
给定一个数组:
698.划分为k个相等的子集
473.火柴拼正方形
416. 分割等和子集
417. 1049. 最后一块石头的重量 II
随机抽样算法
- 算法:机器所有吐出的球都等概率放进袋子里
- leetcode:382. Linked List Random Node 链表随机结点
- leetcode:398. Random Pick Index随机数索引
模拟
- leetcode:43. 字符串相乘
- leetcode:49. 字母异位词分组
- leetcode:50. Pow(x, n)
- leetcode:54. 螺旋矩阵
- leetcode:58. 最后一个单词的长度
- leetcode:59. 螺旋矩阵 II
- leetcode:65. 有效数字
- leetcode:66. 加一
- leetcode:68. 文本左右对齐
- leetcode:71. 简化路径
- leetcode:73. 矩阵置零
- leetcode:89. 格雷编码
- leetcode:130. 被围绕的区域
- leetcode:200. 岛屿数量
- leetcode:463. 岛屿的周长
- leetcode:419. 甲板上的战舰
- leetcode:695. 岛屿的最大面积
- leetcode:1020. 飞地的数量
- leetcode:165. 比较版本号
- leetcode:168. Excel表列名称、171. Excel 表列序号
- leetcode:233. 数字 1 的个数 这题不会
- leetcode:237. 删除链表中的节点
- leetcode:258. 各位相加
- leetcode:136. 只出现一次的数字
- leetcode:137. 只出现一次的数字 II
- leetcode:260. 只出现一次的数字 III
- leetcode:268. 缺失数字
- leetcode:263. 丑数
- leetcode:273. 整数转换英文表示
- leetcode:284. 顶端迭代器
- leetcode:299. 猜数字游戏
- leetcode:345. 反转字符串中的元音字母
- leetcode:335. 路径交叉 待研究
- leetcode:382. 链表随机节点
- leetcode:383. 赎金信
- leetcode:385. 迷你语法分析器
- leetcode:393. UTF-8 编码验证
- leetcode:400. 第 N 位数字
- leetcode:405. 数字转换为十六进制数
- leetcode:412. Fizz Buzz
- leetcode:414. 第三大的数
- leetcode:423. 从英文中重建数字
- leetcode:434. 字符串中的单词数
- leetcode:498.Diagonal Traverse 对角线遍历
- leetcode:1424. Diagonal Traverse II对角线遍历 II
遇见过的真实的面试题
- 飞步科技:
- 美团笔试题目
华为机试
- 华为机试:路灯照明问题
- 求哪些区间缺失了
- 华为机试:IPv4地址转换成整数
- 第一步:先对字符串进行切割
- 第二步:判断IP地址是否合法
- 第三步:将IP地址转换为整数
- 华为机试:敏感字段加密
- 字符串切割
- 华为机试:数组连续和
- 前缀和数组 + 二分
- 华为机试:在字符串中找出连续最长的数字串(含“±”号) ************
- 华为机试:出错的或电路
- 华为机试:跳格子
- 思路:检测图有没有环、DFS
- 华为机试:解密犯罪时间
- 华为机试:图像物体的边界
- 华为机试:二叉树中序遍历
- 先建树,然后中序遍历
- 华为机试:完全二叉树非叶子部分后序遍历
- 华为机试:单词搜索,不能走回头路
- 怎么记住回头路:在开始遍历之前标记已经走过,在四个方向都尝试完了,恢复现场
- 华为机试:字符串匹配
- exp[i]中的*必须和exp[i - 1]时绑定
- 当ei == exp.size()时,si必须也匹配完成
- 当ei还有字符时,那么exp[ei + 1]是不是*:
- 如果不是,那么只能匹配一个字符
- 如果是,那么exp可以匹配多个
- 此时必须。必须
exp[ei] == '.' || exp[ei] == str[si]
,si才能++
- 此时必须。必须
- 华为机试:快速人名查找
- DFS
- 华为机试:导师请吃火锅
- 贪心
- 菜刚好能吃的时间是下菜需要的时间 + 煮菜需要的时间。我们先计算出吃菜的时间,再按照吃菜时间从小到大排序
- 然后用一个数组标记这个菜能不能吃掉
- 第一个菜一定能吃到
- 下一个菜能吃掉的前提是:当前时间 > 前一个夹菜时间 + 冷却时间(我们需要一个变量统计上一次吃菜的索引)
- 最后统计数组中能吃到的菜的数量
- 华为机试:找到比自己强的人数
- 双重for循环,枚举每一个老师,枚举每一个学生
- 只要teacher > student,说明对于teacher来说,有一个学生超过了它
- 那么:
- map[teacher] += 1
- map[student] +=0
- 华为机试:分糖问题
- 考异或性质
- 华为机试:分苹果
- 华为机试:猜密码
- 考回溯
- 华为机试:走矩阵迷宫,计算出陷阱方格与不可达方格分别有多少个
- 考察深度优先搜索
- 先生成一个方格,将限制置于1(障碍物)
- 对方格进行搜索(只能从左下角出发)。如果发现不能到达就置于3,如果能够到达就置于2
- 最后统计方格中3(陷阱)的数量和0(不可达)
- 考察深度优先搜索
- 华为机试:走矩阵迷宫,左下角到右下角的最短路径(输出坐标)
- 递归:对每一个位置
- 先判断当前是不是有效位置
- 如果是:
- 看当前是不是已经走过的路
- 看当前是不是终点
- 如果都不是,尝试从四个方向走,选择最小的那个(注意,当前位置可能是陷阱)
- 动态规划
- 递归:对每一个位置
- 华为机试:有一个矩阵,每个点都可以往8个方向转发,要求求出左下角到右下角的最小传输时延
- 动态规划
- 华为机试:有一张图,每条边都有权重&&有方向,求出从源到目的的最小碰撞时延
- 考察迪克拉斯算法
- 华为机试:有一张图,没有边,从起点到所有节点返回,最长需要多少时间
- 单源最短路径问题,找到起始节点到其他节点的最短路径的最大值 * 2即可。
- 这里用BFS实现了
- 华为机试:污染水域
- 先把所有的污染源都入队
- 然后从各个污染源同时开始一圈一圈的向净水扩散,
- 那么最后扩散到的净水就是花费的天数!
-
- 栈
-
- 策略:让任务工作时间最长的机器先运行;
- 第一步:先按照工作时间降序排列
- 动态规划:dp[i]表示当前机器工作完成经过的总时间
- 转移方程: 因为第i台机器开始配置并工作必须是前i-1台工作都完成了配置,当前机器之前的总配置时间用last来表示,则第i台机器完成工作所需要的总时间是 dp[i] = last + machine[i][0] + machine[i][1];
-
- 并查集
- 补种未成活胡杨
- 滑动窗口:保证你窗口内有k个未成活,然后求最大窗口大小就行
- 使每个子串的ASCII码值的和均为水仙花数
- “水仙花数”是指一个三位数,每位上数字的立方和等于该数字本身,如371是’水仙花数’,因371=33+73+1^3
- 第一步:我们应该预处理出所有三位数的水仙花数
- 第二步:然后对str进行回溯,找出所有可能的分割结果
- 最小交换次数
- 先计算出所有小于等于k的元素,假设为cnt
- 然后维护一个长度“cnt”的滑动窗口,并统计这个窗口内有多少元素大于k。
- 然后所有窗口中的最小计数就是答案
- leetcode:223. 矩形面积
- 一维线段你是怎么判断重叠的面积的
- 构成的正方形数量
- 关键点:判断正方形,正方形必须是对角线垂直而且长度相等
- We Are A Team
- 并查集
- 无序正数数组其和>=k的连续子数组的个数
- 滑动窗口
- 前缀和 + 二分
-
华为机试
- 热点网站统计
- 待完成
- 运维日志排序
- 能够跳到终点的最少步骤数
- leetcode:106. 从中序与后序遍历序列构造二叉树
- 从中序遍历递归
- 用后序遍历确定根元素(后继数组不需要idx,先创建右子树,再创建左子树)
- 华为机试:数组二叉树,输出从根节点到最小叶子节点的路径上各个节点的值
- 先找到最小叶子节点
- 然后从叶子节点逆序找到根节点
- 用连续自然数之和来表达整数
- 整型数组按个位值排序
- GPU 算力
- 用 more 变量削峰,一次处理1秒内新增的任务,处理不完的放下一秒一起处理。
- 单词接龙
- 找出符合要求的字符串子串
- 字符串匹配
- 354. 俄罗斯套娃信封问题
- 排序:先对宽度升序;宽度相同时,再对高度进行降序
- 对高度高度数组找最长递增子序列
- 最少需要多少面试官
- 首先进行一些排序,然后用一个大根堆,维护当前每次面试的结束时间
- 然后当一个新的时间安排出现的时候,判断一下是否需要一个新的面试官,还是使用老的面试官
- 骰子问题:骰子是一个立方体
- 移掉 K 位数字的最小值
- 比较两个版本号的大小
-
找单词:给一个字符串和一个二维字符数组,如果该字符串存在于该数组中,则按字符串的字符顺序输出字符串每个字符所在单元格的位置下标字符串
-
- 这道题简单来说就是:当各个区间有交集的时候取交集,再求交集的并集
- 怎么求交集:双指针
- 一个指针扫描A,一个指针扫描B,根据子区间的两端,求出交集
- 只要startB <= endB,就形成了一个交集
- 交集的左边界是:std::max(startA, startB);
- 交集的右边界是:std::min(endA,endB);
- 指针怎么移动?
- 较早结束的子区间,不可能跟其他子区间重叠,它的指针要移动;另一个不动
- 一个指针扫描A,一个指针扫描B,根据子区间的两端,求出交集
- 怎么求并集:升序后判断重叠
- 先按照起始时间排序,然后判断是否重叠(start[i] < end) ,如果不重叠,压入一个新区间,否则更新右边界
-
- 多态规划
- 模拟
-
- 可以用前缀树来做
-
- 回溯,全排列
-
- 找积木总长度与每层长度、层高之间的关系(每层长度*层高=积木总长度)
- 总长度很好算,层高是我们最终要输出的结果
- 那每层长度可以算吗?很明显也是有一个区间范围的:[积木中最长的,积木中最长的+积木中最短的]
-
- 如果对一个数分类
- 先经数字a转换成16进制表示
- 将给定16进制按照两个一组进行相加
- 将叠加之后的数字对b进行取余
- 将求余之后的结果与c比较,如果大于等于c则是一个无效的数字,如果小于c则有效。
- 对数组中的每一个数进行分类,并计算每一种类型中可以有多少个数字,输出最大的那个数字
- 如果对一个数分类
-
- 用一个有序的map存储内存、内存数量
- 遍历需要分配的内存,在map中找是否有满足要求的
-
- 模拟,可以用数组、链表、map等实现
-
- 典型的模拟题目:可以将N进制转换为十进制并进行减法之后在将结果转换为N进制
-
- 第一个进来的人做最左边,第二个进来的做最右边
- 然后需要找里做下的最远距离的最小索引位置:遍历已经做下的位置,找到中间索引最小的最大距离
-
- 思路:先根据依赖关系建立一个并查集,然后用故障表ban感染掉有依赖关系的集合,最后找出所有非故障的集合
-
- 模拟
-
- 模拟
-
- 把每个人可能到达的地点全部用DFS求出,在通过原来的l中的目的地为3和这两个人是否都能到达到获得最终结果
-
- 维护一个滑动窗口,滑动窗口内的元音字符串的个数刚好是flow个
-
- 动态规划
-
- 模拟扩散,多源广度优先搜索
- 热点网站统计
–
leetcode大神
https://www.cnblogs.com/grandyang/p/4606334.html
https://github.com/gzwl/leetcode
https://blog.csdn.net/lanxu_yy/column/info/leetcode-solution
https://programmercarl.com
目标:在我职业生涯的前3年,至少把leetcode上的题刷完一半
刷题oj:https://www.luogu.com.cn/problem/list?orderBy=difficulty&order=asc&difficulty=1&page=1