03 2019 档案
摘要:[toc] 题目链接 "Populating Next Right Pointers in Each Node II" 注意点 不要访问空结点 不是完美二叉树 解法 解法一:递归,DFS。因为不是完美二叉树所以子树有可能残缺,故需要平行扫描父节点同层的节点,找到他们的左右子节点。然后右节点就是找到的
阅读全文
摘要:[toc] 题目链接 "Populating Next Right Pointers in Each Node LeetCode" 注意点 不要访问空结点 二叉树是满二叉树也就是说如果有左节点一定会有右节点 解法 解法一:递归,DFS。因为是完美二叉树所以左子结点的next指针可以直接指向其右子节点
阅读全文
摘要:[toc] 题目链接 "Pascal's Triangle II LeetCode" 注意点 只能使用O(k)的额外空间 有可能numRows等于0 解法 解法一:除了第一个数为1之外,后面的数都是上一次循环的数值加上它前面位置的数值之和,不停地更新每一个位置的值,便可以得到第n行的数字。 小结
阅读全文
摘要:[toc] 题目链接 "Pascal's Triangle LeetCode" 注意点 就是杨辉三角形 有可能numRows等于0 解法 解法一:规律是每一行的首个和结尾一个数字都是1,从第三行开始,中间的每个数字都是上一行的左右两个数字之和。掌握了之后逐层计算就好 class Solution {
阅读全文
摘要:[toc] 题目链接 "Flatten Binary Tree to Linked List LeetCode" 注意点 不要访问空结点 val会有负值 解法 解法一:递归,DFS。先找到最低一层的最左子节点,然后回到其父节点,把其父节点和右子节点断开,将原左子结点连上父节点的右子节点上,然后再把原
阅读全文
摘要:如图所示: 解决方法: 使用ssh链接下载而不是https
阅读全文
摘要:[toc] 题目链接 "Path Sum II LeetCode" 注意点 不要访问空结点 解法 解法一:递归,DFS。每当DFS搜索到新节点时,都要保存该节点。而且每当找出一条路径之后,都将这个保存为一维vector的路径保存到最终结果二维vector中。并且,每当DFS搜索到子节点,发现不是路径
阅读全文
摘要:[toc] 题目链接 "Path Sum LeetCode" 注意点 不要访问空结点 val会有负值 解法 解法一:递归,DFS。首先判空,若当前结点不存在,则直接返回false,如果如果输入的是一个叶节点,则比较当前叶节点的值和参数sum值是否相同,若相同,返回true,否则false。 这个条件
阅读全文
摘要:[toc] 题目链接 "Minimum Depth of Binary Tree LeetCode" 注意点 不要访问空结点 解法 解法一:递归,DFS。首先判空,若当前结点不存在,直接返回0。然后看若左子结点不存在,那么对右子结点调用递归函数,并加1返回。反之,若右子结点不存在,那么对左子结点调用
阅读全文
摘要:[toc] 题目链接 "Balanced Binary Tree LeetCode" 注意点 不要访问空结点 解法 解法一: 用于求各个点深度的,然后对每个节点的两个子树来比较深度差,时间复杂度为O(NlgN)。 小结 avl的子树高度差不超过1
阅读全文
摘要:[toc] 题目链接 "Convert Sorted List to Binary Search Tree LeetCode" 注意点 不要访问空结点 题目要求的是平衡二叉搜索树(也就是AVL树) 解法 解法一:递归,二叉搜索树的中序遍历结果刚好是一个有序数组,有序数组中间的数字刚好是根节点,因此可
阅读全文
摘要:[toc] 题目链接 "Convert Sorted Array to Binary Search Tree LeetCode" 注意点 不要访问空结点 题目要求的是平衡二叉搜索树(也就是AVL树) 解法 解法一:递归,二叉搜索树的中序遍历结果刚好是一个有序数组,有序数组中间的数字刚好是根节点,因此
阅读全文
摘要:[toc] 题目链接 "Binary Tree Zigzag Level Order Traversal LeetCode" 注意点 不要访问空结点 解法 解法一:递归,递归,在 "Binary Tree Level Order Traversal LeetCode" 的基础上将奇数层(下标从0开始
阅读全文
摘要:[toc] 题目链接 "Validate Binary Search Tree LeetCode" 注意点 不要访问空结点 结点的val有可能会正好等于int的最大取值范围 解法 解法一:因为这里的二叉搜索树定义是说重复的数字也不算,所以可以用中序遍历,然后判断是否是递增的。 解法二:利用它本身的性
阅读全文
摘要:[toc] 题目链接 "Binary Tree Level Order Traversal LeetCode" 注意点 不要访问空结点 解法 解法一:递归,在 "Binary Tree Level Order Traversal LeetCode" 的基础上将结果逆序即可。 解法二:非递归,同样在
阅读全文
摘要:[toc] 题目链接 "Binary Tree Level Order Traversal LeetCode" 注意点 不要访问空结点 解法 解法一:递归,level表示深度,如果当前ret.size()等于深度,就说明到了一个新的深度。用level访问不同的深度。 解法二:非递归,queue里面存
阅读全文
摘要:[toc] 题目链接 "Maximum Depth of Binary Tree LeetCode" 注意点 不要访问空结点 解法 解法一:递归,当前深度与最大深度相比,是否大于,大于就更新。 小结 在写 这种语句的时候一定要清楚的认识到root是NULL才会为真。
阅读全文
摘要:[toc] 题目链接 "Subsets II LeetCode" 注意点 有重复的数字 数组可能是无序的,要先排序 解法 解法一:递归,只需要在 "Subsets" 中递归写法的基础上多加一句 j即可,因为已经排序了,所以加进去的如果已经存在就说明是重复的。 解法二:递归。只需要在 "Subsets
阅读全文
摘要:[toc] 题目链接 "Pow(x, n) LeetCode" 注意点 暴力乘n会超时 解法 解法一:递归。折半计算,每次把n缩小一半,这样n最终会缩小到0,任何数的0次方都为1,这时候我们再往回乘。如果此时n是偶数,直接把上次递归得到的值算个平方返回即可,如果是奇数,则还需要乘上个x的值。还有一点
阅读全文
摘要:[toc] 什么是二叉搜索树 二叉搜索树(英语:Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左
阅读全文
摘要:[toc] 什么是堆 堆(英语:heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。堆总是满足下列性质: 堆中某个节点的值总是不大于或不小于其父节点的值; 堆总是一棵完全二叉树。 通常将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。 堆的存
阅读全文
摘要:[toc] 题目链接 "Symmetric Tree LeetCode" 注意点 先判断结点是否为空再访问结点的值 解法 解法一:递归,从根结点开始判断,然后递归判断左子树的左子树和右子树的右子树以及左子树的右子树和右子树的左子树是否相等。 解法二:非递归,和递归思想一样,但是显式的用栈来模拟递归的
阅读全文
摘要:[toc] 题目链接 "Same Tree LeetCode" 注意点 先判断结点是否为空再访问结点的值 解法 解法一:递归,从根结点开始判断,然后递归判断左右子树。 解法二:非递归,和递归思想一样,但是显式的用栈来模拟递归的过程。 class Solution { public: vector c
阅读全文
摘要:众所周知,在C++中有三种参数传递的方式: 按值传递(pass by value) include using namespace std; void swap(int a,int b) { int temp = a; a = b; b = temp; } int main() { int a =
阅读全文
摘要:[toc] 题目链接 "Word Search LeetCode" 注意点 尽量减少函数参数的个数,而且最好使用引用,否则速度会慢很多 解法 解法一:典型的dfs。从开头的字母开始,往四周寻找下一个字母,如果没有匹配的就返回false。根据 "短路特性" 找到一个匹配的之后就会继续访问下去。 cla
阅读全文
摘要:[toc] 题目链接 "Subsets LeetCode" 注意点 解法 解法一:递归,每次就将tmp加入ret中,然后往tmp中加一个数字,继续递归。原理如下,第i(i 0)层表示nums[i 1]的状态(选择或者不选择),最后叶节点就是结果。 解法二:非递归,nums中的数字一个个处理,从空集开
阅读全文
摘要:[toc] 题目链接 "Combinations LeetCode" 注意点 解法 解法一:递归,如果tmp中有k个数字就把tmp加到ret中,否则继续往tmp添加数字。 解法二:非递归,如果tmp中有k个数字就把tmp加到ret中,否则继续往tmp添加数字。 class Solution { pu
阅读全文
摘要:[toc] 解释 对于语句 来说如果表达式1为假,那么表达式2不会进行运算,也就是说表达式2"被短路"。同理 如果表达式1为真,那么表达式2不会进行运算,表达式2"被短路"。 运用 经常会看到这样的写法 class Solution { public: int Sum_Solution(int n)
阅读全文
摘要:[toc] 题目链接 "Search a 2D Matrix LeetCode" 注意点 maxtrix是有序的 解法 解法一:二分搜索。从右上角开始,大于target就往左搜索,小于target就往下搜索。时间复杂度O(logn)。 class Solution { public: bool se
阅读全文
摘要:[toc] 题目链接 "Merge Sorted Array LeetCode" 注意点 要合并到nums1里面,不能新开数组 解法 解法一:把nums2加到nums1尾部,然后对nums1进行排序。时间复杂度O(logn) 小结 预测接下来会有合并k个有序数组...
阅读全文
摘要:[toc] 题目链接 "Find Common Characters LeetCode" 注意点 不能单纯的以字母出现的次数来判断是否是公共的字母 解法 解法一:将第一个字符串的每个字母逐个在其他字符串中查找,如果所有的字符串都含有就加入res。时间复杂度O(n^2),n是所有字符串的长度之和。 解
阅读全文
摘要:[toc] 题目链接 "Longest Word in Dictionary through Deleting LeetCode" 注意点 长度一样的字符串要按字典序返回较小的 解法 解法一:遍历字典中的单词,用一个变量i来记录单词中的某个字母的位置,我们遍历给定字符串,如果遍历到单词中的某个字母来
阅读全文
摘要:[toc] 题目链接 "Set Matrix Zeroes LeetCode" 注意点 不要用O(mn)空间复杂度的解法 解法 解法一:line数组表示第i行是否有0,row数组表示第i列是否有0,先遍历一遍,某个位置为0就修改相应的数组。最后根据line和row两个数组来修改matrix。时间复杂
阅读全文
摘要:[toc] 题目链接 "Minimum Path Sum LeetCode" 注意点 数字很大,结果可能会溢出 解法 解法一:dp,走到某一格的位置dp值等于它左边和上面格子中较小的dp值加上该位置的值。其实只需要一个一维数组也可以实现。时间复杂度O(mn) 小结 动态规划题
阅读全文
摘要:[toc] 题目链接 "Unique Paths II LeetCode" 注意点 数字很大,结果可能会溢出 解法 解法一:dp,走到某一格的位置等于它左边和上面格子(前提是格子的值不为1)的dp值之和。其实只需要一个一维数组也可以实现。时间复杂度O(mn) 小结 动态规划题
阅读全文