02 2023 档案
【LeetCode二叉树#13】遍历二叉搜索树
摘要:二叉搜索树中的搜索 力扣题目地址(opens new window) 给定二叉搜索树(BST)的根节点和一个值。 你需要在BST中找到节点值等于给定值的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 NULL。 例如, 在上述示例中,如果要找的值是 5,但因为没有节点值为 5,我们应该返回
【LeetCode二叉树#12】合并二叉树(巩固层序遍历)
摘要:合并二叉树 力扣题目链接(opens new window) 给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。 你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的
【LeetCode二叉树#11】最大二叉树(构造二叉树)
摘要:最大二叉树 力扣题目地址(opens new window) 给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下: 二叉树的根是数组中的最大元素。 左子树是通过数组中最大值左边部分构造出的最大二叉树。 右子树是通过数组中最大值右边部分构造出的最大二叉树。 通过给定的数组构建最大二叉
【LeetCode二叉树#10】从中序与后序(或者前序)遍历序列构造二叉树(首次构造二叉树)
摘要:从中序与后序遍历序列构造二叉树 力扣题目链接(opens new window) 根据一棵树的中序遍历与后序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 中序遍历 inorder = [9,3,15,20,7] 后序遍历 postorder = [9,15,7,20,3] 返
【LeetCode二叉树#09】路径总和I+II,以及求根节点到叶节点数字之和(回溯回溯,还是™的回溯)
摘要:### 路径总和 [力扣题目链接(opens new window)](https://leetcode.cn/problems/path-sum/) 给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。 说明: 叶子节点是指没有子节点的节点。
【LeetCode二叉树#08】寻找树左下角的值(回溯机制X深度)
摘要:找树左下角的值 力扣题目链接(opens new window) 给定一个二叉树,在树的最后一行找到最左边的值。 示例 1: 示例 2: 思路 层序遍历 这个是很自然的思路,因为层序遍历可以避免对于“最底层”这个要求的繁琐判定 在层序遍历的过程中,我们只需要保存最后一层的结果即可 代码 和标准的层序
【LeetCode二叉树#07】左叶子节点之和(基于栈的迭代法前中后序遍历复习)
摘要:左叶子节点之和 力扣题目链接(opens new window) 计算给定二叉树的所有左叶子之和。 示例: 思路 注意审题,这里是要求 左叶子节点 之和 不是二叉树中的左侧节点之和,因此使用层序遍历是不合适的 我们要明确的是,到底什么是左叶子节点 举个例子: 根据上图以及题目给的例子可知,我们无法直
【LeetCode二叉树#06】获取二叉树的所有路径(分析递归中的回溯机制)
摘要:二叉树所有路径 力扣题目链接(opens new window) 给定一个二叉树,返回所有从根节点到叶子节点的路径。 说明: 叶子节点是指没有子节点的节点。 示例: 思路 根据题意,每次遍历至子节点,我们都需要返回根节点然后从另外一条路径继续遍历 关键点是:返回,实现这个机制需要使用递归与回溯 且最
【webserver 前置知识 01】Linux系统编程入门
摘要:题外话,PA里面也有很不错的Linux基础基础 传送门:https://nju-projectn.github.io/ics-pa-gitbook/ics2019/linux.html 静态库与动态库 什么玩意? 库文件是计算机上的一类文件,可以简单的把库文件看成一种代码仓库,它提供给使用者一些可以
【LeetCode二叉树#05】平衡二叉树
摘要:力扣题目链接(opens new window)](https://leetcode.cn/problems/balanced-binary-tree/) 给定一个二叉树,判断它是否是高度平衡的二叉树。 本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。
【LeetCode二叉树#04】判断对称二叉树、相同的树、另一棵子树、树的子结构(二叉树相等判断)
摘要:对称二叉树 力扣题目链接(opens new window) 给定一个二叉树,检查它是否是镜像对称的。 思路 本题中,不能单纯去比较左右子节点的是否对称(都有值且不为空) 因为如果按上面那样做的话,到子节点后就肯定是不对称的(对于左半边而言),但整体上看可能还是对称的,仍然满足题意,由此就会出现错误
【LeetCode二叉树#03】翻转二叉树的几种方法
摘要:翻转二叉树 力扣题目链接(opens new window) 翻转一棵二叉树。 这道题目背后有一个让程序员心酸的故事,听说 Homebrew的作者Max Howell,就是因为没在白板上写出翻转二叉树,最后被Google拒绝了。(真假不做判断,权当一个乐子哈) 思路 使用一种二叉树的遍历方法遍历,然
【LeetCode二叉树#02】二叉树层序遍历(广度优先搜索),十合一专题
摘要:### 二叉树层序遍历(广度优先搜索) #### 102 二叉树的层序遍历 [力扣题目链接(opens new window)](https://leetcode.cn/problems/binary-tree-level-order-traversal/) 给你一个二叉树,请你返回其按 层序遍历
【LeetCode二叉树#01】二叉树的遍历(递归/迭代)
摘要:二叉树递归遍历 写递归算法时候需要遵循的三个点: 确定递归函数的参数和返回值: 确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。 确定终止条件: 写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条
【LeetCode二叉树#00】二叉树的基础知识
摘要:基础知识 分类 满二叉树 如果二叉树中除了叶子结点,每个结点的度都为 2,则此二叉树称为满二叉树。 完全二叉树 除了底层外,其他部分是满的,且底层从左到右是连续的,称为完全二叉树 满二叉树一定是完全二叉树 举个例子: 完全二叉树 1 / \ 2 3 / \ / \ 4 5 6 不是完全二叉树 1 /
【LeetCode栈与队列#06】前K个高频元素(TopK问题),以及pair、priority_queue的使用
摘要:前 K 个高频元素 力扣题目链接(opens new window) 给定一个非空的整数数组,返回其中出现频率前 k 高的元素。 示例 1: 输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2] 示例 2: 输入: nums = [1], k = 1 输出: [1] 提
【LeetCode栈与队列#05】滑动窗口最大值
摘要:滑动窗口最大值 力扣题目链接(opens new window) 给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回滑动窗口中的最大值。 进阶: 你能在线性时间复杂度内解决此题吗? 提示:
【LeetCode栈与队列#04】逆波兰表达式求值(仍然是经典的栈操作)
摘要:逆波兰表达式求值 力扣题目链接(opens new window) 根据 逆波兰表示法,求表达式的值。 有效的运算符包括 + , - , * , / 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。 说明: 整数除法只保留整数部分。 给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值
【LeetCode栈与队列#03】删除字符串中所有的相邻重复项
摘要:删除字符串中所有的相邻重复项 力扣题目链接(opens new window) 给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。 在 S 上反复执行重复项删除操作,直到无法继续删除。 在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。 示例: 输入:"a
【LeetCode栈与队列#02】有效括号
摘要:有效括号 力扣题目链接(opens new window) 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 注意空字符串可被认为是有效字符串。 示例 1: 输入: "
【LeetCode栈与队列#01】队列的基本操作:用栈模拟队列和用队列模拟栈
摘要:用栈实现队列 力扣题目链接(opens new window) 使用栈实现队列的下列操作: push(x) -- 将一个元素放入队列的尾部。 pop() -- 从队列首部移除元素。 peek() -- 返回队列首部的元素。 empty() -- 返回队列是否为空。 示例: MyQueue queue
【LeetCode字符串#06】KMP巩固练习:重复子串
摘要:重复的子字符串 力扣题目链接(opens new window) 给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。 示例 1: 输入: "abab" 输出: True 解释: 可由子字符串 "ab" 重复两次构成。 示例 2:
【LeetCode字符串#05】基于个人理解的KMP算法图解,以及应用到strStr()函数实现
摘要:KMP算法(用于实现 strStr()) strStr()函数是用来在一个字符串中搜索是否存在另一个字符串的函数,其匹配字符串方式为KMP算法 KMP算法基础理论 假设有如下两个字符串 文本串 aabaabaaf 模式串 aabaaf 我们希望在文本串中匹配出模式串 Intro 暴力法 使用两层fo
【LeetCode字符串#04】左旋转字符串,以及反转函数使用说明
摘要:左旋转字符串 力扣题目链接(opens new window) 字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。 示例 1: 输入: s = "a
【LeetCode字符串#03】图解翻转字符串中的单词,以及对于for使用的说明
摘要:翻转字符串中的单词 力扣题目链接(opens new window) 给定一个字符串,逐个翻转字符串中的每个单词。 示例 1: 输入: "the sky is blue" 输出: "blue is sky the" 示例 2: 输入: " hello world! " 输出: "world! hel
【LeetCode字符串#02】替换空格+IP地址无效化,reserve和resize的区别分析
摘要:### 替换空格 [力扣题目链接(opens new window)](https://leetcode.cn/problems/ti-huan-kong-ge-lcof/) 请实现一个函数,把字符串 s 中的每个空格替换成"%20"。 示例 1: 输入:s = "We are happy." 输出
【LeetCode字符串#01】反转字符串I+II
摘要:反转字符串 力扣题目链接(opens new window) 编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。 不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 你可以假设数组中的所有字符都是 ASCII
【LeetCode】三数之和+四数之和(双指针)
摘要:之所以放在一起是因为,"四数之和"的解题方法基本与"三数之和"一致 由此我们可以推出n数之和的解法 本质上,我们只是使用双指针的方法降低此类问题的时间复杂度 当然用哈希法也可以解,那就是另外的故事了 三数之和 力扣题目链接(opens new window) 给你一个包含 n 个整数的数组 nums
【LeetCode哈希表#5】四数相加II(map)
摘要:四数相加II 力扣题目链接(opens new window) 给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] + B[j] + C[k] + D[l] = 0。 为了使问题简单化,所有的 A, B, C, D 具有相同的长度
【LeetCode哈希表#4】梦开始的地方:两数之和(map),以及关于容器map的一些代码技巧
摘要:### 两数之和 [力扣题目链接(opens new window)](https://leetcode.cn/problems/two-sum/) 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对
【C++ 泛型编程01:模板】函数模板与类模板
摘要:【模板】 除了OOP外,C++另一种编程思想称为 泛型编程 ,主要利用的技术就是模板 C++提供两种模板机制:函数模板和类模板 函数模板 函数模板作用 建立一个通用函数,其函数返回值类型和形参类型可以不具体制定,用一个虚拟的类型来代表。 语法 template<typename T> 函数声明或定义
【教程搬运】分析并编写suricata规则(内含两个示例)
摘要:suricata规则分析 参考1 参考2 Suricata 签名的结构 在高层次上,Suricata签名由三部分组成: Action:当流量符合规则时采取的行动 Header:一个标题,描述主机、IP地址、端口、协议和流量方向(传入或传出) Options:选项,指定诸如签名ID(sid)、日志信息