随笔分类 - 课程 / 题
摘要:一、题目 给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下: 节点的左子树只包含 小于 当前节点的数。 节点的右子树只包含 大于 当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。 二、思路 当前节点的值是其左子树的值的上界(最大值) 当前节点
阅读全文
摘要:一、题目 给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。 二、思路 使用颜色标记节点的状态,新节点为白色,已访问的节点为灰色。 如果遇到的节点为白色,则将其标记为灰色,然后将其右子节点、自身、左子节点依次入栈。 如果遇到的节点为灰色,则将节点的值输出。 三、代码 class Solu
阅读全文
摘要:一、题目 输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。 二、思路 构建双指针距离: 前指针 former 先向前走 k 步(结束后,双指针 former 和 latter 间相距 k 步)。 三、代码 class Solutio
阅读全文
摘要:一、题目 给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。 返回删除后的链表的头节点。 二、思路 定位节点: 遍历链表,直到 head.val == val 时跳出,即可定位目标节点。修改引用: 设节点 cur 的前驱节点为 pre ,后继节点为 cur.next ;则执行 pr
阅读全文
摘要:一、题目 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。 二、思路 三、代码 class Solution: def lengthOfLongestSubstring(self, s: str) -> int: dic = {} res = tmp = 0 for j
阅读全文
摘要:一、题目 给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。 二、思路 三、代码 class Solution: def
阅读全文
摘要:一、题目 在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物? 二、思路 设 f(i,j)为从棋盘左上角走至
阅读全文
摘要:一、题目 输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。 要求时间复杂度为O(n)。 二、思路 若 dp[i−1]≤0,说明 dp[i−1]对 dp[i]产生负贡献,即 dp[i−1]+nums[i]还不如 nums[i]本身大。 当 dp[i−1]>0时:执
阅读全文
摘要:一、题目 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。 答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。 二、思路 原理: 以斐波那契数列性质 f(n+1)=f(n)+f(n−1)为转移方程
阅读全文
摘要:一、题目 写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下: F(0) = 0, F(1) = 1 F(N) = F(N - 1) + F(N - 2), 其中 N > 1. 斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前
阅读全文
摘要:一、题目 请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。 二、思路 考虑从顶至底递归,判断每对节点是否对称,从而判断树是否为对称二叉树。 三、代码 class Solution: def isSymmetric(self, root: TreeNode
阅读全文
摘要:一、题目 请完成一个函数,输入一个二叉树,该函数输出它的镜像。 二、思路 根据二叉树镜像的定义,考虑递归遍历(dfs)二叉树,交换每个节点的左 / 右子节点,即可生成二叉树的镜像。 三、代码 class Solution: def mirrorTree(self, root: TreeNode) -
阅读全文
摘要:一、题目 输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构) B是A的子结构, 即 A中有出现和B相同的结构和节点值。 二、思路 先序遍历树 A 中的每个节点 nA;(对应函数 isSubStructure(A, B)) 判断树 A中 以 nA为根节点的子树 是否包含树
阅读全文
摘要:一、题目 请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。 二、思路 利用双端队列的两端皆可添加元素的特性,设打印列表(双端队列) tmp ,并规定: 奇数层 则添加至 tmp 尾部 , 偶数层 则
阅读全文
摘要:一、题目 从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。 二、思路 每一层打印到一行 。 三、代码 class Solution: def levelOrder(self, root: TreeNode) -> List[List[int]]: if not root:
阅读全文
摘要:一、题目 从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。 二、思路 二叉树的 广度优先搜索(BFS)。 三、代码 class Solution { public int[] levelOrder(TreeNode root) { if(root == null) return
阅读全文
摘要:一、题目 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 给你一个可能存在 重复 元素值的数组 numbers ,它原来是一个升序排列的数组,并按上述情形进行了一次旋转。请返回旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一次旋转,该数组的
阅读全文
摘要:一、题目 在一个 n * m 的二维数组中,每一行都按照从左到右 非递减 的顺序排序,每一列都按照从上到下 非递减 的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 二、思路 若 flag > target ,则 target 一定在 flag 所在 行
阅读全文
摘要:一、题目 一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。 二、思路 循环二分: 当 left ≤ right 时循环 (即当闭区间 [left, j] 为空时跳出) ; 三、代码
阅读全文
摘要:一、题目 统计一个数字在排序数组中出现的次数。 二、思路 整个数组是单调递增的,我们可以利用二分法来加速查找的过程。 三、代码 class Solution { public: int binarySearch(vector<int>& nums, int target, bool lower) {
阅读全文