Home

Awesome

LeetCode-Solutions-in-Good-Style

GitHub issues GitHub forks GitHub stars GitHub license

说明:我和绝大多数同学一样,一边学习、一边总结。我会争取做更多的分享,给大家带来一些有用的知识,感谢大家一直以来的支持。

大家好,这里是一个《算法与数据结构》的入门级教程,适用于算法零基础和转行同学,不适合于准备算法竞赛。想传递的观点是:写逻辑清楚的代码,所以我写的代码一定经过了严格的思考,格式非常标准,不带有个人风格,不会为了缩减代码行数而少写一个空行和注释。在这里:

Octotree 插件

可以叫我 weiwei,在我力所能及且时间允许的情况下,我会尽可能回答我知道的问题。如果有不能及时回复的问题,可能是因为我没有看到站内通知,可以发邮件给我 liweiwei1419@gmail.com

我录制的视频题解

我从 2019 年 9 月开始录制视频题解。最开始的时候,我会对着要讲的材料录好几遍。现在讲解知识点的时候写逐字稿。已经沉淀了很多视频,其实也算是一个小小的体系课程,现在罗列在这里,希望能够对大家有所帮助。

0. 算法新手如何刷力扣(LeetCode)?【干货分享】

1. 时间复杂度与空间复杂度

这个视频提到了时间复杂度是一个渐进概念,需要用动态的角度去理解。并且讲解了时间复杂度的严格定义(极限形式),以便大家理解时间复杂度的计算规则。并且还指出了:时间复杂度不是程序的运行时间;应该使用「空间换时间」,更多关注在优化「时间复杂度」。

2. 二分查找

这个视频介绍了如何写对二分查找算法,二分查找的细节虽然多,但只要我们掌握了正确的解题思路,并且多加练习、勤于思考、多做总结,写对二分查找的问题就不再困难。

下面的视频讲解了几道二分查找的例题,我们重点分析了题意和如何利用题目中给出的条件逐渐缩小搜索区间。

题目链接力扣B 站
35. 搜索插入位置(简单)(空缺)B 站
34. 在排序数组中查找元素的第一个和最后一个位置(简单)力扣B 站
1095. 山脉数组中查找目标值(中等)力扣B 站
4. 寻找两个正序数组的中位数(困难)力扣B 站

我们通过「力扣」第 4 题(寻找两个正序数组的中位数)的分析,向大家介绍了这样的技巧:如果要找的目标元素的性质比较复杂,可以对这条性质取反,进而写出可以简单的可以缩减问题区间的逻辑语句。

3. 和排序相关的问题

「归并排序」和「快速排序」是非常重要的排序算法,深刻理解它们对于理解「递归」函数的运行机制有着非常大的帮助,同时它们也是「分治思想」的典型应用。「逆序对」和「荷兰国旗问题(颜色分类)」也是非常经典的算法问题。

题目链接力扣B 站
《剑指 Offer》 51. 数组中的逆序对(困难)力扣B 站
315. 计算右侧小于当前元素的个数(困难)力扣B 站

计算「逆序对」完全就是按照「归并排序」的思路而来。

题目链接力扣B 站
75. 颜色分类(中等)力扣B 站

在「颜色分类」问题的讲解中,我们向大家介绍了「循环不变量」,在编写代码的过程中,我们应该一直遵守所使用的变量的语义,在「程序执行前」「执行过程中」「执行结束」以后保持不变。遵守我们自己定义「循环不变量」是我们写对正确代码的重要方法。

题目链接力扣B 站
41. 缺失的第一个正数(困难)力扣B 站

「缺失的第一个正数」是一个经典的算法问题,用到的思想是「原地哈希」,可以理解为是「桶排序」算法的特殊应用:一个萝卜一个坑,一个桶里只存放一个元素。要和大家强调的是,可以这样做是和输入数组的元素的数值密切相关。

4. 滑动窗口

「滑动窗口」问题是典型的应用「循环不变量」解决的问题,比较考验我们编码和调试的能力。

题目链接力扣B 站
76. 最小覆盖子串(困难)力扣B 站
424. 替换后的最长重复字符(中等)力扣B 站
567. 字符串的排列(中等)力扣B 站
978. 最长湍流子数组(中等)力扣B 站
992. K 个不同整数的子数组(困难)力扣B 站

5. 栈相关的问题

使用「栈」解决的问题,需要我们通过具体例子,发现解决它们正好符合「后进先出」的规律:

掌握下面这两个问题,离不开对具体例子的研究,进而归纳出一般规律。

题目链接力扣B 站
84. 柱状图中最大的矩形(困难)力扣B 站
316. 去除重复字母(中等)力扣B 站

「栈」最为广泛的一种应用就是作为「递归」「深度优先遍历」「分治算法」的数据结构支持。

6. 并查集

「并查集」这个数据结构目前来说在面试中出现比较少,如果是准备算法面试的朋友,可以跳过。

题目链接力扣B 站
990. 等式方程的可满足性(中等)力扣B 站
399. 除法求值(中等)力扣B 站
959. 由斜杠划分区域(中等)力扣B 站
765. 情侣牵手(困难)力扣B 站
947. 移除最多的同行或同列石头(中等)力扣B 站
803. 打砖块(困难)力扣B 站
1202. 交换字符串中的元素(中等)力扣B 站
778. 水位上升的泳池中游泳(困难)力扣B 站

7. 树

树的问题很多都可以使用「深度优先遍历」或者「广度优先遍历」去做。

题目链接力扣B 站
105. 从前序与中序遍历序列构造二叉树(中等)力扣B 站

8. 回溯算法

「回溯算法」其实就是对题目中所蕴含的「树形结构」执行一次 深度优先遍历。做这一类问题,在草稿纸上画出树形结构图很重要。

题目链接力扣B 站
46. 全排列(中等)力扣B 站
47. 全排列 II(中等)力扣B 站
78. 子集(中等)力扣B 站
90. 子集 II(中等)(空缺)B 站

9. 动态规划

题目链接力扣B 站
5. 最长回文子串(中等)力扣B 站
416. 分割等和子集(中等)力扣B 站
《剑指 Offer》46. 把数字翻译成字符串(中等)力扣B 站

10. 广度优先遍历与拓扑排序

题目链接力扣B 站
127. 单词接龙(困难)力扣B 站
1203. 项目管理(困难)力扣B 站

11. 哈希表

题目链接力扣B 站
1. 两数之和(简单)力扣B 站

12. 位运算相关

题目链接力扣B 站
1128. 等价多米诺骨牌对的数量(简单)力扣B 站
315. 计算右侧小于当前元素的个数(困难)力扣B 站

我的个人网站和算法学习笔记

微信群与 QQ 群

如果需要一起刷题的朋友,可以加入微信群和 QQ 群。

我的 LeetBook

这里给自己做一个宣传,我最近在「力扣」上推出了自己的 LeetBook:零起步学算法(原名《使用「力扣」学习算法与数据结构》),主要面向 转行零基础 的朋友,讲解算法与数据结构的基础知识。

说明

使用「力扣」学习算法与数据结构


「力扣」分类以及题解目录(按照 LeetBook 的章节编排,第 16 章以后为目前 LeetBook 不包含的章节)

说明:题目分类与我的 LeetBook 章节对应。

第 1 章 时间复杂度

这部分内容介绍了 时间复杂度 这个概念,可以收看 【视频讲解】 ,完全免费。 这一章节没有练习。

第 2 章 二分查找

题型一:二分求下标

题号链接题解
704二分查找(简单)
35搜索插入位置(简单)【视频讲解】文字题解
34在排序数组中查找元素的第一个和最后一个位置(简单)【视频讲解】文字题解
1095 山脉数组中查找目标值(中等)【视频讲解】文字题解
4寻找两个有序数组的中位数(困难)【视频讲解】文字题解

说明


练习

题号链接题解
33搜索旋转排序数组(中等)文字题解
81搜索旋转排序数组 II(中等)文字题解
153153. 寻找旋转排序数组中的最小值(中等)文字题解
154154. 寻找旋转排序数组中的最小值 II(困难)文字题解
275 H指数 II(中等)文字题解
436寻找右区间(中等)文字题解
1237找出给定方程的正整数解(中等)
1300转变数组后最接近目标值的数组和(中等)文字题解

题型二:二分确定一个有范围的整数(二分答案)

算法思想:减而治之。如果题目要我们找一个整数,这个整数有确定的范围,可以通过二分查找逐渐缩小范围,最后逼近到一个数。

题号链接题解
69x 的平方根(简单)文字题解
287寻找重复数(中等)文字题解
374猜数字大小(简单)文字题解
1283使结果不超过阈值的最小除数(中等)文字题解
1292元素和小于等于阈值的正方形的最大边长(中等)

题型三:复杂的判别函数(最大值极小化问题)

说明:这一类问题本质上还是「题型二」(二分答案),但是初学的时候会觉得有一些绕。这一类问题的问法都差不多,关键字是「连续」、「正整数」,请大家注意捕捉题目中这样的关键信息。

题号链接题解
875爱吃香蕉的珂珂(中等)文字题解
410分割数组的最大值(困难)文字题解
LCP 12小张刷题计划(中等)
1011在 D 天内送达包裹的能力(中等)
1482制作 m 束花所需的最少天数(中等)
1552两球之间的磁力(中等)

第 3 章 基础排序算法

这一部分包含了四种基础排序算法:选择排序、插入排序、希尔排序、冒泡排序。

「力扣」第 912 题:排序数组题解:总结了排序问题的一些要点和学习资料,可以从排序问题开始学习算法。

数组的问题可以作为算法「新手场」,因为这些问题只需要掌握编程语言的基础知识就可以完成。以下问题都很容易想到解决方案,即使没有学习过相关的数据结构和算法知识。

知识点:循环不变量

题号链接题解
912排序数组(中等)文字题解
26删除排序数组中的重复项(简单)
27移除元素(简单)
283移动零(简单)文字题解

第 4 章 高级排序算法(重要)

这一部分需要重点掌握三种高级排序算法:归并排序、快速排序、堆排序。

题号链接题解
88合并两个有序数组(简单)从后向前归并
《剑》51数组中的逆序对(困难)【视频讲解】文字题解
75颜色分类(中等)文字题解
215数组中的第K个最大元素(中等)文字题解
451根据字符出现频率排序(中等)

说明

第 5 章 非比较排序(选学)

这一部分包含了三种非比较排序排序:计数排序、基数排序、桶排序。解决这些问题需要知道 原地哈希 这个概念。

题号链接题解
41缺失的第一个正数(困难)【视频讲解】文字题解
《剑》3剑指 Offer 03. 数组中重复的数字(中等)
448找到所有数组中消失的数字(简单)
442数组中重复的数据(中等)

第 6 章 滑动窗口与双指针

一、滑动窗口

滑动窗口的参考写法(不是模板,请不要原样照搬,仅供参考,理解算法设计思想是更重要的):

public class Solution {

    public String slidingWindow(String s, String t) {
        // 起始的时候,都位于 0,同方向移动
        int left = 0;
        int right = 0;
        while (right < sLen) {
            if ( 在右移的过程中检测是否满足条件 ) {
                // 对状态做修改,好让程序在后面检测到满足条件
            }
            // 右边界右移 1 格
            right++;
            while ( 满足条件 ) {
                // 走到这里是满足条件的,左边界逐渐逐渐左移,可以取最小值
                if ( 在左移的过程中检测是否不满足条件 ) {
                    // 对状态做修改,好让程序在后面检测到不满足条件
                }
                // 左边界左移 1 格
                left++;
            }
            // 走到这里是不满足条件的,右边界逐渐右移,可以取最大值
        }
        return 需要的结果变量;
    }
}

友情提示:第 3 题和第 76 题是必须要会做的基本问题。上面的问题理解透彻了,下面的问题就可以比较轻松地做出来。

重点问题

题号链接题解
3无重复字符的最长子串(中等)文字题解
76最小覆盖子串(困难)【视频讲解】
209长度最小的子数组(中等)
424替换后的最长重复字符(中等)
1493 删掉一个元素以后全为 1 的最长子数组(中等)

说明

public class Solution {

    // 第 424 题代码:滑动窗口(暴力解法的优化)

    public int longestSubarray(int[] nums) {
        int len = nums.length;
        int left = 0;
        int right = 0;

        // 连续的 1 的个数
        int ones = 0;

        // 删除一个元素以后全为 1 的最长的子串的长度
        int maxCount = 0;
        int res = 0;

        while (right < len) {
            if (nums[right] == 1) {
                ones++;
            }
            maxCount = Math.max(maxCount, ones);
            right++;
            // maxCount + 1 里的 1 就表示删除的那个元素
            while (right - left > maxCount + 1) {
                if (nums[left] == 1) {
                    ones--;
                }
                left++;
            }
            res = Math.max(res, right - left);
        }
        // 注意:这里返回 res 要减 1
        return res - 1;
    }
}

练习

题号题目题解知识点
438找到字符串中所有字母异位词(中等)
567字符串的排列(中等)
643子数组最大平均数 I(简单)
978最长湍流子数组(中等)
992K 个不同整数的子数组(困难)

说明

二、双指针

「双指针」问题其实也是朴素算法的优化,一下子排序掉很多不符合题意的解,「滑动窗口」技巧也是这样的。依然是分析为什么可以使用双指针是更重要的。

二分查找算法应用于查找下标也可以认为是双指针的解法。

题号链接题解知识点
11盛最多水的容器(中等)
15三数之和(中等)
16最接近的三数之和(中等)文字题解
42接雨水(困难)文字题解
167两数之和 II - 输入有序数组(简单)文字题解
925长按键入(简单)

第 7 章 链表

解决链表问题,很实用的技巧是「画图」。其它算法问题的分析和讲解(和面试官讲解)也是这样。

可以为链表编写测试函数,方便调试。建议实现的方法有:① 通过数组创建一个单链表;② 根据当前结点打印当前结点以及后面的结点。这两个方法可以非常方便地帮助我们调试关于链表的程序。

题型一:基本的链表指针指向问题

注意:有一些问题需要使用「虚拟头结点」,以避免对链表第一个结点的复杂的分类讨论逻辑。这个思想在数组里我们见过,叫「哨兵」。

使用递归函数,避免复杂的更改指针变量指向操作,使得求解问题变得简单。

题号链接题解
2两数相加
82删除排序链表中的重复元素 II
26反转链表
24两两交换链表中的节点
25K 个一组翻转链表
328奇偶链表
203移除链表元素
21合并两个有序链表(简单)
876链表的中间结点(简单)文字题解
148排序链表文字题解

说明:

题型二:快慢指针技巧

确切地说,叫「同步指针」可能更好一些。

使用两个指针变量,刚开始都位于链表的第一个结点,一个永远一次只走一步,另一个永远一次只走两步,一个在前,一个在后,同时走。这样当快指针走完的时候,慢指针就来到了链表的中间位置。

解决这些问题的共同特点就是使用两个指针变量同步移动。快慢指针的前进方向相同,且它们步伐的「差」是恒定的,根据这种确定性去解决链表中的一些问题。使用这种思想还可以解决链表的以下问题:

题号链接题解
19倒数第 k 个结点
141环形链表
142环形链表 II
161相交链表

说明

题型三:设计数据结构

题号链接题解
707设计链表(中等)
355设计推特(中等)哈希表 + 链表 + 优先队列(经典多路归并问题)(Java)
146LRU 缓存机制(中等)哈希表 + 双向链表(Java)
460LFU 缓存(困难)哈希表 + 双向链表(Java)
1206设计跳表(困难)

第 8 章 栈与队列

一、栈

题型一:基本的使用栈解决的问题

下面的问题非常基础,一定需要掌握:

题号链接题解
20有效的括号(简单)
71简化路径(中等)
155最小栈(简单)文字题解
225用队列实现栈(简单)文字题解
232用栈实现队列(简单)文字题解
946946. 验证栈序列(中等)

练习

题号链接题解
284顶端迭代器(中等)
341扁平化嵌套列表迭代器(中等)
946验证栈序列(中等)
1111有效括号的嵌套深度(中等)文字题解
题型二:单调栈

单调栈就是普通的栈,在使用的过程中恰好符合了「后进先出」,栈内元素单调的特点。「单调栈」和「单调队列」的问题通常来说很特殊,掌握例题和一些练习就可以了。

经验:单调栈中一般存下标。

题号链接题解
84柱状图中最大的矩形(困难)视频题解文字题解
42接雨水(困难)文字题解
739每日温度(中等)文字题解
316去除重复字母(困难)文字题解

说明

练习

序号题目题解
496下一个更大元素 I(简单)暴力解法、单调栈
503下一个更大元素 II(中等)
901股票价格跨度(中等)LeetCode 第 901 题:股票价格跨度(单调栈)

二、队列

题型一:基本的使用队列解决的问题

所有的使用广度优先遍历解决的问题,都使用了队列。

题号题目序号题解
622设计循环队列(中等)数组实现的循环队列
641设计循环双端队列(中等)数组实现的循环双端队列
621任务调度器(中等)
1306跳跃游戏 III(中等)(中等)
题型二:单调队列

单调队列就是普通的队列。「力扣」上的单调队列目前就发现这一个问题,关键分析清楚为什么设计的算法恰好使得单调队列。另外,「背包问题」中有使用单调队列进行优化的例子,感兴趣的朋友可以了解一下,是竞赛方面的知识。

经验:单调队列中一般存下标。

题号链接题解
239滑动窗口最大值(中等)文字题解

第 9 章 优先队列

说明:了解「堆」作为「优先队列」的实现是有必要的,有助于理解 remove()replace() 这些编码的细节,使用堆的时候才会更加有效。

应用:动态 选取当前队列中优先级最高的元素,重点理解「动态」的含义。

题号链接题解
23合并K个排序链表(困难)文字题解
215数组中的第K个最大元素(中等)文字题解
295数据流的中位数(困难)文字题解
347前 K 个高频元素(中等)
703数据流中的第K大元素(简单)
973最接近原点的 K 个点(中等)
1296划分数组为连续数字的集合(中等)

第 10 章 并查集

并查集知识点的【视频讲解】在第 990 题视频题解里有。基础且常见的问题有:

题号链接题解
990等式方程的可满足性(中等)视频题解文字题解
547朋友圈(中等)(中等)文字题解
200岛屿数量(中等)(中等)文字题解
684冗余连接(中等)
1319连通网络的操作次数(中等)文字题解
128最长连续序列(困难)(中等)

选做问题:

题号链接题解
945使数组唯一的最小增量(中等)文字题解
399除法求值(中等)
685冗余连接 II(困难)
721账户合并(中等)
765情侣牵手(困难)
952按公因数计算最大组件大小(困难)文字题解

第 11 章 树(二叉树与二分搜索树)

题号题目序号题解
105从前序与中序遍历序列构造二叉树(中等)视频题解文字题解
106从中序与后序遍历序列构造二叉树(中等)文字题解
226翻转二叉树(中等)文字题解
94二叉树的中序遍历(中等)文字题解
230二叉搜索树中第 K 小的元素(中等)文字题解
108将有序数组转换为二叉搜索树(中等)文字题解
109有序链表转换二叉搜索树(中等)文字题解
199二叉树的右视图(中等)文字题解

第 12 章 回溯算法

题型一:基本回溯问题

通过这些问题理解回溯算法的思想,回溯算法的知识点讲解在「力扣」第 46 题的视频题解和文字题解。

回溯就是用深度优先遍历的方式去搜索 树(图)的所有解。深度优先遍历有很明显的递归结构。

做对下面这些问题的技巧:① 画图、画图、画图;② 理解深度优先遍历与递归;③ 多调试、多调试。

题号题目序号题解
46全排列(中等)视频题解文字题解
47全排列 II(中等)视频题解文字题解
78子集(中等)视频题解文字题解
90子集 II(中等)视频题解
77组合(中等)文字题解
39组合总和(中等)文字题解
40组合总和 II(中等)文字题解
113路径总和 II(中等)文字题解
60第 k 个排列(中等)文字题解
257二叉树的所有路径(中等)文字题解
491递增子序列(中等)
1593拆分字符串使唯一子字符串的数目最大(中等)
1071活字印刷(中等)设计递归函数返回值

题型二:字符串上的回溯问题

重点理解:由于字符串每次都生成新字符,无须状态重置。

题号链接题解
17电话号码的字母组合(中等)文字题解
22括号生成(中等)文字题解
93复原IP地址(中等)文字题解
784字母大小写全排列(中等)文字题解

题型三:Flood Fill

题号链接题解
79单词搜索(中等)文字题解
200被围绕的区域(中等)
130被围绕的区域(中等)

题型四:一些游戏问题

序号题目序号题解
51N皇后(困难)文字题解
37解数独(困难)
529扫雷游戏(中等)文字题解

说明:

第 13 章 动态规划(上)

动态规划的两个重要思想:

动态规划的两个思考方向:

可以使用动态规划的解决问题需要具备的三个条件:

动态规划的两个重要概念:

问题分类参考:

说明:下面给出的典型问题还会添加(2020 年 12 月 2 日)。

一、入门问题

了解「自顶向下」记忆化递归与「自底向上」递推两种动态规划的方式。

题号链接题解
509斐波那契数(简单)

二、重复子问题

这部分需要用到「分步计数乘法原理」、「分类计数加法原理」。

题号链接题解
70 爬楼梯(简单)CSDN
91解码方法(中等)文字题解
《剑》46把数字翻译成字符串(中等)视频题解

第 70 题:和斐波拉契数是同一道问题。计数类问题会用到分类计数原理、分步计数原理。

三、最优子结构

题号链接题解
279完全平方数(中等)
322零钱兑换(中等)文字题解
343整数拆分(中等)文字题解
377组合总和 Ⅳ(中等)动态规划

说明

第 377 题注意甄别不是背包问题。

四、无后效性

序号链接题解
198打家劫舍(简单)文字题解
120三角形最小路径和(中等)
62不同路径(中等)
63不同路径 II(中等)
64最小路径和(中等)

练习:

题号链接题解
121买卖股票的最佳时机(简单)暴力枚举 + 动态规划 + 差分思想CSDN
122买卖股票的最佳时机 II(简单)暴力搜索 + 贪心算法 + 动态规划CSDN
123买卖股票的最佳时机 III(困难)动态规划CSDN
188188. 买卖股票的最佳时机 IV(困难)动态规划
309最佳买卖股票时机含冷冻期(中等)动态规划
714买卖股票的最佳时机含手续费(中等)动态规划

以下是一些「动态规划」经典问题。因为这些问题很重要,所以单独作为一个分类。

五、最大子段和

题号链接题解
53最大子序和(中等)文字题解CSDN

练习:

题号链接题解
152乘积最大子数组(中等)动态规划(理解无后效性)

六、最长上升子序列

题号链接题解
300最长上升子序列(中等)动态规划 (包含O (N log N) 解法的状态定义以及解释)

说明:第 300 题是非常经典的动态规划问题。$O(N \log N)$ 的解法,针对问题本身的特点进行状态定义,并证明状态数组是有序数组,降低了时间复杂度。

练习:

题号链接题解
354俄罗斯套娃信封问题文字题解
646最长数对链(中等)

七、最长公共子串

题号链接题解
1143最长公共子序列(中等)文字题解
72 编辑距离(困难)文字题解CDSN
10正则表达式匹配(困难)

八、区间 DP 与划分型 DP

区间 DP:

题号链接题解
5最长回文子串(中等)文字题解
312戳气球(困难)

划分型 DP:

题号链接题解
410分割数组的最大值(困难)文字题解

九、树形 DP

题号链接题解
337打家劫舍 III(中等)文字题解
124二叉树中的最大路径和(困难)

第 14 章 动态规划(下)

一、背包问题

image.png

背包九讲:https://github.com/tianyicui/pack

题目序号题解知识点
416. 分割等和子集动态规划(0-1 背包问题)很重要的动态规划模型,必须掌握
518. 零钱兑换 II动态规划(套用完全背包问题模型)
322. 零钱兑换(中等)动态规划、使用「完全背包」问题思路、图的广度优先遍历
494. 目标和0-1 背包问题
474. 一和零动态规划(转换为 0-1 背包问题)

(会补充「博弈类型 DP」、「状态压缩 DP」、「数位 DP」等。)

其它问题

题号链接题解
746使用最小花费爬楼梯(简单)文字题解
887鸡蛋掉落(困难)动态规划(只解释官方题解方法一)(Java)
32最长有效括号(困难)CSDN

第 15 章 贪心算法

题号链接题解
12整数转罗马数字(中等)贪心算法(Java)
452用最少数量的箭引爆气球(中等)
455分发饼干(中等)
122买卖股票的最佳时机 II(简单)
56合并区间(中等)贪心算法(Java)
45跳跃游戏 II(困难)
55跳跃游戏(中等)
376摆动序列(中等)

第 17 章 哈希表

题号链接题解
1两数之和(简单)视频讲解
36有效的数独(中等)哈希表(布尔数组、位运算)
49字母异位词分组(中等)自定义字符串的哈希规则,使用质数作为乘法因子(Java)
202快乐数(简单)
217存在重复元素(简单)
219存在重复元素 II(简单)
454四数相加 II(中等)

第 18 章 前缀和与哈希表

题号链接题解
560和为K的子数组(中等)暴力解法、前缀和、前缀和优化(Java)
1248统计「优美子数组」(中等)
974和可被 K 整除的子数组(中等)

第 19 章 广度优先遍历

题号链接题解
剑 13机器人的运动范围(中等)深度优先遍历、广度优先遍历
207课程表(中等)拓扑排序、深度优先遍历
210课程表 II(中等)拓扑排序(广度优先遍历) + 深度优先遍历(Java、Python)
993二叉树的堂兄弟节点(中等)深度优先遍历、广度优先遍历
690员工的重要性(简单)深度优先遍历、广度优先遍历(Java、Python)
1306跳跃游戏 III(中等)广度优先遍历
365水壶问题(中等)图的广度优先遍历(Java)
127单词接龙(中等)广度优先遍历、双向广度优先遍历(Java、Python)
126单词接龙 II(困难)单双向广度优先遍历 + 回溯算法(Java、Python)

树的广度优先遍历的一些问题、LeetBook 里的一些问题。

第 20 章 图论算法(最小生成树)

第 21 章 图论算法(单源最短路径)

第 22 章 分治算法

分治思想(分而治之)把一个规模较大的问题拆分成为若干个规模较小的相同类型的子问题,然后对这些子问题递归求解,等待每一个子问题完成以后,再得到原问题的解。

分治算法可以并行执行,但是在基础算法领域,分治算法是以 深度优先遍历 的方式执行的。

应用分治思想的典型算法:归并排序、快速排序。

分治思想的典型问题:「剑指 Offer 第 51 题」:《剑指 Offer》 51. 数组中的逆序对(视频讲解)

题号链接题解
50Pow(x, n)文字题解

其它典型问题(待添加)

题目题解知识点
66. 加一(简单)
189. 旋转数组记住这个旋转三次的操作。
8. 字符串转换整数 (atoi)尽量不使用库函数、一次遍历(Java)

还会继续更新,欢迎朋友们多提宝贵意见!