LeetCode 109——有序链表转化二叉搜索树

2018-12-18
阅读 3 分钟
1.2k
在 LeetCode 108——将有序数组转化为二叉搜索树 中,我们已经实现了将有序数组转化为二叉搜索树。因此,这里,我们可以先遍历一遍链表,将节点的数据存入有序数组中,然后再将有序数组转化为二叉搜索树即可。

C++ 学习笔记之——字符串和字符串流

2018-12-05
阅读 7 分钟
4.5k
字符数组,也就是存放字符类型数据的数组,只不过字符数组的结尾必须是 '0'。C++ 已经提供了一些字符串处理函数,这些函数被封装在头文件 <cstring> 和 <string.h> 中。

LeetCode 240——搜索二维矩阵 II

2018-11-24
阅读 3 分钟
2.4k
1. 题目 2. 解答 2.1. 方法一 从矩阵的左下角开始比较 目标值等于当前元素,返回 true; 目标值大于当前元素,j 增 1,向右查找,排除掉此列上边的数据(都比当前元素更小); 目标值小于当前元素,i 减 1,向上查找,排除掉此行右边的数据(都比当前元素更大)。 {代码...} 2.2. 方法二 我们先沿着对角线的方向,找到第...

LeetCode 100——相同的树

2018-11-22
阅读 1 分钟
2.3k
1. 题目 2. 解答 针对两棵树的根节点,有下列四种情况: p 和 q 都为空,两棵树相同; p 不为空 q 为空,两棵树不相同; p 为空 q 不为空,两棵树不相同; p 和 q 都不为空,如果两个节点的值相同,而且递归判断左右子树也相同的话,两棵树相同,反之两棵树不同。 {代码...} 获取更多精彩,请关注「seniusen」!

LeetCode 98——验证二叉搜索树

2018-11-22
阅读 2 分钟
1.6k
1. 题目 2. 解答 针对一个节点,有下列四种情况: 节点为空或者节点的左右节点都为空; 只有右结点为空; 只有左结点为空; 左右结点都不为空; 如果当前节点的左右子节点值满足二叉搜索树的条件,我们可以递归判断左右子树是否为二叉搜索树。如果左右子树也满足二叉搜索树条件,同时左子树最大节点(也即前驱结点)值小...

LeetCode 95——不同的二叉搜索树 II

2018-11-21
阅读 2 分钟
2.1k
以 $1, 2, \cdots, n$ 构建二叉搜索树,其中,任意数字都可以作为根节点来构建二叉搜索树。当我们将某一个数字作为根节点后,其左边数据将构建为左子树,右边数据将构建为右子树。因此,这是一个递归问题。

LeetCode 96——不同的二叉搜索树

2018-11-20
阅读 3 分钟
1.1k
以 $1, 2, \cdots, n$ 构建二叉搜索树,其中,任意数字都可以作为根节点来构建二叉搜索树。当我们将某一个数字作为根节点后,其左边数据将构建为左子树,右边数据将构建为右子树。因此,这是一个递归问题。

LeetCode 108——将有序数组转化为二叉搜索树

2018-11-19
阅读 1 分钟
1.4k
1. 题目 2. 解答 一棵高度平衡的二叉搜索树意味着根节点的左右子树包含相同数量的节点,也就是根节点为有序数组的中值。 因此,我们将数组的中值作为根节点,然后再递归分别得到左半部分数据转化的左子树和右半部分数据转化的右子树即可。 递归终止的条件是数组为空,这时候返回 NULL。 {代码...} 获取更多精彩,请关注...

LeetCode 104——二叉树中的最大深度

2018-11-19
阅读 1 分钟
1.4k
1. 题目 2. 解答 如果根节点为空,直接返回 0。如果根节点非空,递归得到其左右子树的深度,树的深度就为左右子树深度的最大值加 1。 {代码...} 获取更多精彩,请关注「seniusen」!

LeetCode 700——二叉搜索树中的搜索

2018-11-19
阅读 1 分钟
1.7k
1. 题目 2. 解答 如果根节点为空,直接返回 NULL。如果根节点非空,从根节点开始循环查找,直到节点为空。 如果待查找的值大于当前节点值,节点指向右孩子; 如果待查找的值小于当前节点值,节点指向左孩子; 如果待查找的值等于当前节点值,返回当前节点。 若循环结束还没有找到,返回 NULL。 {代码...} 获取更多精彩,...

LeetCode 107 ——二叉树的层次遍历 II

2018-11-17
阅读 2 分钟
1.6k
定义一个存放树中数据的向量 data,一个存放树的每一层数据的向量 level_data 和一个存放每一层节点的队列 node_queue。

LeetCode 102 ——二叉树的层次遍历

2018-11-17
阅读 2 分钟
2.5k
定义一个存放树中数据的向量 data,一个存放树的每一层数据的向量 level_data 和一个存放每一层节点的队列 node_queue。

LeetCode 145 ——二叉树的后序遍历

2018-11-17
阅读 4 分钟
1.5k
1. 题目 2. 解答 2.1. 递归法 定义一个存放树中数据的向量 data,从根节点开始,如果节点不为空,那么 递归得到其左子树的数据向量 temp,将 temp 合并到 data 中去 递归得到其右子树的数据向量 temp,将 temp 合并到 data 中去 将当前节点的数值加入到 data 中 {代码...} 2.2. 迭代法一 仿照前序遍历的思想,只不过这次...

LeetCode 144 ——二叉树的前序遍历

2018-11-17
阅读 4 分钟
1.4k
1. 题目 2. 解答 2.1. 递归法 定义一个存放树中数据的向量 data,从根节点开始,如果节点不为空,那么 将当前节点的数值加入到 data 中 递归得到其左子树的数据向量 temp,将 temp 合并到 data 中去 递归得到其右子树的数据向量 temp,将 temp 合并到 data 中去 {代码...} 2.2. 迭代法 定义一个存放树中节点的栈 node_st...

LeetCode 94 ——二叉树的中序遍历

2018-11-17
阅读 4 分钟
1.6k
1. 题目 2. 解答 2.1. 递归法 定义一个存放树中数据的向量 data,从根节点开始,如果节点不为空,那么 递归得到其左子树的数据向量 temp,将 temp 合并到 data 中去 将当前节点的数值加入到 data 中 递归得到其右子树的数据向量 temp,将 temp 合并到 data 中去 {代码...} 2.2. 迭代法 定义一个存放树中节点的栈 node_st...

LeetCode 707 ——设计链表

2018-11-14
阅读 4 分钟
3.2k
1. 题目 2. 解答 用一个单链表来实现,只有一个头指针。因为不能建立哨兵结点,因此要特别注意是否在头结点处操作。 {代码...} 获取更多精彩,请关注「seniusen」!

LeetCode 92 ——反转链表 II

2018-11-14
阅读 2 分钟
1.8k
我们需要先找到第 m 个结点及其上一个结点,然后将从 m 到 n 的结点进行反转,最后依次将 m 到 n 反转后的结点和 n 之后的结点放入原链表中即可。

LeetCode 86 ——分隔链表

2018-11-14
阅读 2 分钟
1.8k
从前向后遍历链表,将结点值小于 x 的结点放入到新链表 1 中,将结点值大于等于 x 的结点放入新链表 2 中。最后,将新链表 2 拼接在新链表 1 后面即可。

LeetCode 82 ——删除排序链表中的重复元素 II

2018-11-14
阅读 2 分钟
1.7k
1. 题目 2. 解答 新建一个链表,并添加一个哨兵结点,从前向后开始遍历链表。 如果下一个结点的值和当前结点的值相等,则循环向后遍历直到找到一个和当前结点值不相等的结点; 反之,如果下一个结点的值和当前结点的值不相等,此值即为原始链表中没有重复出现的数字,将其加入到新链表中。 然后继续向后遍历。最后, 如...

LeetCode 83 —— 删除排序链表中的重复元素

2018-11-14
阅读 1 分钟
1.4k
1. 题目 2. 解答 从前向后遍历链表,如果下一个结点的值和当前结点的值相同,则删除下一个结点,否则继续向后遍历。 {代码...} 获取更多精彩,请关注「seniusen」!

LeetCode 61——旋转链表

2018-11-14
阅读 5 分钟
1.1k
1. 题目 2. 解答 2.1. 方法一 将链表每个节点向右移动 1 个位置,其实就是让链表最后一个结点指向第一个结点。 因此,向右移动 k 个位置就重复上述过程 k 次即可。 然后,我们注意到,若链表有 n 个结点,则移动 n 次后就还是原链表。 {代码...} 实际上,若链表有 n 个结点,我们只需要移动 n % k 次即可。 确定链表有多...

LeetCode 24——两两交换链表中的节点

2018-11-14
阅读 2 分钟
2.3k
新建一个哨兵结点作为头结点,然后每次交换相邻两个结点。并依次将它们连接到新链表中去,再将原链表中后面的结点也串到新链表后面。直至到达链尾或者剩余一个节点,则此时返回新链表的头结点,也即是原始链表的第二个结点。

LeetCode 4——两个排序数组中的中位数

2018-11-07
阅读 4 分钟
2.1k
因为要遍历两个数组,所以时间复杂度为 $O(m+n)$,而题目中要求算法的时间复杂度为 $O(log (m+n))$,因此应该是有更高效的算法,借助于二分查找。

LeetCode 36——有效的数独

2018-10-31
阅读 4 分钟
2.8k
将数独中数字的 ASCII 码值转化到 0-8 之间作为散列值,建立一个散列表,然后分别逐行、逐列、逐宫(3*3小块)统计每个数字的出现次数,若出现次数大于 1,则数独无效。

LeetCode 3——无重复字符的最长子串

2018-10-31
阅读 3 分钟
2k
1. 题目 2. 解答 2.1. 方法一 我们从前往后遍历字符串,start 代表最长子串的起始位置,一开始设置为零。 如果没有遇到重复字符,则更新子串的长度,向后遍历。 如果遇到重复字符时,则更新字符串起始位置为上一个相同字符的后面一个位置,同时更新子串长度。 重复上面这个过程,直到遍历完毕。 'abcabc',start = 0,st...

LeetCode 74——搜索二维矩阵

2018-10-29
阅读 2 分钟
1.7k
1. 题目 2. 解答 若矩阵为空,比如 [], [[]],此时直接返回 false。 若目标值小于矩阵第一个元素或者大于矩阵最后一个元素,则目标值不在矩阵范围内,直接返回 false。 其他情况下,则从矩阵第一行开始逐行扫描。若目标值位于矩阵某一行数值范围内,再针对矩阵的某一行用二分查找精准定位。 {代码...} 获取更多精彩,请...

LeetCode 389——找不同

2018-10-29
阅读 2 分钟
1.8k
将 s 和 t 转化为 Python 的列表,然后遍历列表 s 的元素,将它们从列表 t 中删除,最后列表 t 中会余下一个元素,即为所求。

LeetCode 2——两数相加

2018-10-28
阅读 2 分钟
1.8k
1. 题目 2. 解答 循环遍历两个链表 若两个链表都非空,将两个链表结点的值和进位相加求出和以及新的进位 若其中一个链表为空,则将另一个链表结点的值和进位相加求出和以及新的进位 然后将每一位的和添加到新链表中。 如果有一个链表为空,且此时进位为 0,我们则只需要将非空链表后面的值复制到新链表即可,可以通过将...

LeetCode 81——搜索旋转排序数组 II

2018-10-27
阅读 3 分钟
1.5k
当 nums[mid] = nums[right] 时,比如 [1, 1, 2, 1, 1],[1, 1, 0, 1, 1],为了找到正确的转折点,我们查看 [mid, right] 之间有没有不等于 nums[mid] 的值,若有,则继续向右查找;否则向左查找。

LeetCode 33——搜索旋转排序数组

2018-10-27
阅读 5 分钟
2.5k
1. 题目 2. 解答 2.1. 方法一 直接进行二分查找,在判断查找方向的时候详细分类。 当 nums[mid] < target 时, 若 nums[left] <= nums[mid],此时,target 一定在nums[mid] 右边,继续向右查找。 若 nums[left] > nums[mid] < nums[right],此时 nums[mid] 两边都有较大的元素,我们要进一步确定查找的方向...