当前位置: 首页 > news >正文

力扣DAY46-50 | 热100 | 二叉树:展开为链表、pre+inorder构建、路径总和、最近公共祖先、最大路径和

前言

中等 、困难 √,越来越有手感了,二叉树done!

二叉树展开为链表

我的题解

前序遍历树,当遇到左子树为空时,栈里pop节点,取右子树接到左子树位置,同时断开该右子树与父节点的连接,直至整个树被遍历完。注意,由于要求展开的单链表向右,最后要把所有的左指针改为右指针。


class Solution {
public:void flatten(TreeNode* root) {TreeNode* node = root;stack<TreeNode*> stk;TreeNode* leaf;TreeNode* rmright;while(node || !stk.empty()){if (node && node != root) leaf->left = node;while (node){stk.push(node);leaf = node;node  = node->left;}node = stk.top();rmright = node;stk.pop();node = node->right;rmright->right = nullptr;}node = root;while(node){node->right = node->left;node->left = nullptr;node = node->right;}}
};

官解

前序遍历

将二叉树展开为单链表之后,单链表中的节点顺序即为二叉树的前序遍历访问各节点的顺序。因此,可以对二叉树进行前序遍历,获得各节点被访问到的顺序。由于将二叉树展开为链表之后会破坏二叉树的结构,因此在前序遍历结束之后更新每个节点的左右子节点的信息,将二叉树展开为单链表。

对二叉树的前序遍历不熟悉的读者请自行练习「144. 二叉树的前序遍历」。

前序遍历可以通过递归或者迭代的方式实现。以下代码通过递归实现前序遍历。

class Solution {
public:void flatten(TreeNode* root) {vector<TreeNode*> l;preorderTraversal(root, l);int n = l.size();for (int i = 1; i < n; i++) {TreeNode *prev = l.at(i - 1), *curr = l.at(i);prev->left = nullptr;prev->right = curr;}}void preorderTraversal(TreeNode* root, vector<TreeNode*> &l) {if (root != NULL) {l.push_back(root);preorderTraversal(root->left, l);preorderTraversal(root->right, l);}}
};

前序遍历和展开同步进行

使用方法一的前序遍历,由于将节点展开之后会破坏二叉树的结构而丢失子节点的信息,因此前序遍历和展开为单链表分成了两步。能不能在不丢失子节点的信息的情况下,将前序遍历和展开为单链表同时进行?

之所以会在破坏二叉树的结构之后丢失子节点的信息,是因为在对左子树进行遍历时,没有存储右子节点的信息,在遍历完左子树之后才获得右子节点的信息。只要对前序遍历进行修改,在遍历左子树之前就获得左右子节点的信息,并存入栈内,子节点的信息就不会丢失,就可以将前序遍历和展开为单链表同时进行。

该做法不适用于递归实现的前序遍历,只适用于迭代实现的前序遍历。修改后的前序遍历的具体做法是,每次从栈内弹出一个节点作为当前访问的节点,获得该节点的子节点,如果子节点不为空,则依次将右子节点和左子节点压入栈内(注意入栈顺序)。

展开为单链表的做法是,维护上一个访问的节点 prev,每次访问一个节点时,令当前访问的节点为 curr,将 prev 的左子节点设为 null 以及将 prev 的右子节点设为 curr,然后将 curr 赋值给 prev,进入下一个节点的访问,直到遍历结束。需要注意的是,初始时 prev 为 null,只有在 prev 不为 null 时才能对 prev 的左右子节点进行更新。

class Solution {
public:void flatten(TreeNode* root) {if (root == nullptr) {return;}auto stk = stack<TreeNode*>();stk.push(root);TreeNode *prev = nullptr;while (!stk.empty()) {TreeNode *curr = stk.top(); stk.pop();if (prev != nullptr) {prev->left = nullptr;prev->right = curr;}TreeNode *left = curr->left, *right = curr->right;if (right != nullptr) {stk.push(right);}if (left != nullptr) {stk.push(left);}prev = curr;}}
};

寻找前驱节点

前两种方法都借助前序遍历,前序遍历过程中需要使用栈存储节点。有没有空间复杂度是 O(1) 的做法呢?

注意到前序遍历访问各节点的顺序是根节点、左子树、右子树。如果一个节点的左子节点为空,则该节点不需要进行展开操作。如果一个节点的左子节点不为空,则该节点的左子树中的最后一个节点被访问之后,该节点的右子节点被访问。该节点的左子树中最后一个被访问的节点是左子树中的最右边的节点,也是该节点的前驱节点。因此,问题转化成寻找当前节点的前驱节点。

具体做法是,对于当前节点,如果其左子节点不为空,则在其左子树中找到最右边的节点,作为前驱节点,将当前节点的右子节点赋给前驱节点的右子节点,然后将当前节点的左子节点赋给当前节点的右子节点,并将当前节点的左子节点设为空。对当前节点处理结束后,继续处理链表中的下一个节点,直到所有节点都处理结束。

class Solution {
public:void flatten(TreeNode* root) {TreeNode *curr = root;while (curr != nullptr) {if (curr->left != nullptr) {auto next = curr->left;auto predecessor = next;while (predecessor->right != nullptr) {predecessor = predecessor->right;}predecessor->right = curr->right;curr->left = nullptr;curr->right = next;}curr = curr->right;}}
};

心得

我属于方法二,一边前序遍历一边展开,但是展开方向错了,应该向右展开而不是左边。具体方法是记录当前节点curr和前置节点pre,并把pre的左指针置空,右指针置为cur。方法一太简单粗暴不赘叙了,就是按照前序遍历的顺序把节点存入容器再重新定义左右指针。方法三挺有意思,寻找右子树节点的前驱节点,是左子树的右节点。“该节点的左子树中的最后一个节点被访问之后,该节点的右子节点被访问”。找到该节点后,把当前节点的右子树接到前驱节点的右指针上,然后把当前节点的左子树接到右指针上。如此循环遍历整个链表。这个做法无需栈来存储树,且优雅十分。

从前序和中序遍历构造二叉树

我的题解

前序遍历:先遍历根节点。中序遍历:根节点左边是左子树,右边是右子树。知道这两个特征之后就可以用递归实现。首先定义哈希表存储所有节点在中序遍历中的index。接着重点是边界判断,我们通过当前节点与中序数组左边界的距离得出前序数组的左子树的右边界,与中序数组右边界的距离得出前序数组右子树距离的有边界。共更新八个边界。

class Solution {
public:unordered_map<int, int> index;TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder, int pl, int pr, int il, int ir){int val = preorder[pl];TreeNode* root = new TreeNode(val);if (pl+1 <= pl+(index[val]-il))root->left = buildTree(preorder, inorder, pl+1, pl+(index[val]-il), il, index[val]-1);if ( pl+(index[val]-il)+1 <= pr)root->right = buildTree(preorder, inorder, pl+(index[val]-il)+1, pr, index[val]+1, ir);return root;}TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {if (preorder.empty())return nullptr;for (int i = 0; i < inorder.size(); i++){index[inorder[i]] = i; }return buildTree(preorder, inorder, 0, preorder.size()-1, 0, inorder.size()-1);}
};

官解

递归与笔者思路一致,迭代太麻烦了,略过。

心得

这个题想了超级久,大致的思路都能想到,最后是没想到要更新那么多边界值(传参数量),所以卡着一直没写出来。(瞄了一眼参数之后)很快就做完了。刚开始也想过用迭代的做法,总有案例不过,原因是只考虑了个例不具有通用性。教训是要相信自己的思路,不要怕麻烦,而且要学会如何设计参数,不要怕多,只要逻辑够清晰,是很容易的。

路径总和Ⅲ

我的题解

用哈希表+前缀和+递归解答此题,哈希表存前缀和,键为前缀和,值为出现次数。每次递归往下,只会父节点到叶子节点,所以传递的哈希表只有父节点的前缀和。依据 前缀和+当前节点-target = 某个前缀和 的关系,更新ans,最后更新哈希表,遍历左右节点。

class Solution {
public:int ans = 0;void findpath(unordered_map<long long, int> premap, TreeNode* node, int target, long long presum){presum = node->val + presum;auto it = premap.find(presum - target);if (it != premap.end())ans += it->second;premap[presum]++;if (node->left) findpath(premap, node->left, target, presum);if (node->right) findpath(premap, node->right, target, presum);}int pathSum(TreeNode* root, int targetSum) {unordered_map<long long, int> premap;premap[0]++;if (root) findpath(premap, root, targetSum, 0);return ans;}
};

官解

深度优先搜索是穷举所有路径,复杂度On2,不可取。

前缀和

我们仔细思考一下,解法一中应该存在许多重复计算。我们定义节点的前缀和为:由根结点到当前结点的路径上所有节点的和。我们利用先序遍历二叉树,记录下根节点 root 到当前节点 p 的路径上除当前节点以外所有节点的前缀和,在已保存的路径前缀和中查找是否存在前缀和刚好等于当前节点到根节点的前缀和 curr 减去 targetSum。

class Solution {
public:unordered_map<long long, int> prefix;int dfs(TreeNode *root, long long curr, int targetSum) {if (!root) {return 0;}int ret = 0;curr += root->val;if (prefix.count(curr - targetSum)) {ret = prefix[curr - targetSum];}prefix[curr]++;ret += dfs(root->left, curr, targetSum);ret += dfs(root->right, curr, targetSum);prefix[curr]--;return ret;}int pathSum(TreeNode* root, int targetSum) {prefix[0] = 1;return dfs(root, 0, targetSum);}
};

心得

官解和笔者思路很相似,不同之处在于笔者把哈希表作为递归参数传递,而官解把前缀和哈希表定义为公共变量。关键之处在于,递归子节点前,对哈希表进行更新操作prefix[curr]++;,递归完对哈希表进行复原prefix[curr]--;另外,这道题思路来源于之前几乎一眼的题目,寻找连续数组和等于k的个数,日积月累中,我也会举一反三了~

二叉树的最近公共祖先

我的题解

这道题同样是递归完成,首先判断当前节点是不是目标节点,再判断左右节点是不是目标节点,如果当前/左/右节点=目标节点任意一个为真,返回真,当前/左/右任意两个节点为真,则当前节点为题解。

class Solution {
public:TreeNode* ans = new TreeNode();bool find(TreeNode* node, TreeNode* p, TreeNode* q){bool itb = false, lb = false, rb = false;if (!node) return false;if (node == p || node == q)itb = true;lb = find(node->left, p, q);rb = find(node->right, p, q);if ((itb && lb) || (itb && rb) || (lb && rb))ans = node;return (itb || lb || rb);}TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {if (find(root, p, q))return ans;return nullptr;}
};

官解

递归与笔者思路一致,不赘叙。

存储父节点

我们可以用哈希表存储所有节点的父节点,然后我们就可以利用节点的父节点信息从 p 结点开始不断往上跳,并记录已经访问过的节点,再从 q 节点开始不断往上跳,如果碰到已经访问过的节点,那么这个节点就是我们要找的最近公共祖先。

从根节点开始遍历整棵二叉树,用哈希表记录每个节点的父节点指针。
从 p 节点开始不断往它的祖先移动,并用数据结构记录已经访问过的祖先节点。
同样,我们再从 q 节点开始不断往它的祖先移动,如果有祖先已经被访问过,即意味着这是 p 和 q 的深度最深的公共祖先,即 LCA 节点。

class Solution {
public:unordered_map<int, TreeNode*> fa;unordered_map<int, bool> vis;void dfs(TreeNode* root){if (root->left != nullptr) {fa[root->left->val] = root;dfs(root->left);}if (root->right != nullptr) {fa[root->right->val] = root;dfs(root->right);}}TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {fa[root->val] = nullptr;dfs(root);while (p != nullptr) {vis[p->val] = true;p = fa[p->val];}while (q != nullptr) {if (vis[q->val]) return q;q = fa[q->val];}return nullptr;}
};

心得

思路简单,现在会使用全局变量返回结果了。第二个方法也不难,就是用哈希表记录所有节点的父节点,然后回溯,其实是最直观的解法。

二叉树中的最大路径和

我的题解

递归完成,计算左右节点的最大值,如果为负数则置为0,如果左+右+当前节点值大于ans更新ans。函数返回当前节点值+左右分支中更大的一个。

class Solution {
public:int ans = INT_MIN;int maxpath(TreeNode* node){if (!node)return 0;int left_max = max(maxpath(node->left), 0);int right_max = max(maxpath(node->right), 0);ans = max(ans, left_max + right_max + node->val);return max(left_max, right_max) + node->val;}int maxPathSum(TreeNode* root) {maxpath(root);return ans;}
};

官解

官解与笔者一致,不赘叙。

心得

这道题跟二叉树的直径解法几乎一致。一开始笔者没有“负数置零”的一步,导致后面赋值非常冗余,要对比自己、左+自己、右+自己、左+右+自己,返回也是要多重对比。但也顺利做出来,这个困难题实际上算是中等程度吧。至此整个二叉树做完了,感觉最右挑战的反而是本科做过的“前序+中序遍历构建二叉树”...想了好久。其他的思路都很顺畅,继续加油!!

相关文章:

力扣DAY46-50 | 热100 | 二叉树:展开为链表、pre+inorder构建、路径总和、最近公共祖先、最大路径和

前言 中等 、困难 √&#xff0c;越来越有手感了&#xff0c;二叉树done&#xff01; 二叉树展开为链表 我的题解 前序遍历树&#xff0c;当遇到左子树为空时&#xff0c;栈里pop节点&#xff0c;取右子树接到左子树位置&#xff0c;同时断开该右子树与父节点的连接&#x…...

备赛蓝桥杯-Python-考前突击

额&#xff0c;&#xff0c;离蓝桥杯开赛还有十个小时&#xff0c;最近因为考研复习节奏的问题&#xff0c;把蓝桥杯的优先级后置了&#xff0c;突然才想起来还有一个蓝桥杯呢。。 到目前为止python基本语法熟练了&#xff0c;再补充一些常用函数供明天考前再背背&#xff0c;算…...

蓝桥杯 Web 方向入门指南:从基础到实战

一、蓝桥杯 Web 方向简介 蓝桥杯是国内最具影响力的编程竞赛之一&#xff0c;Web 方向主要考察前端开发和后端服务能力。比赛形式为 4 小时限时编程&#xff0c;题型包括页面布局、数据交互、API 开发等。根据最新大纲&#xff0c;大学组需掌握 HTML5、CSS3、JavaScript、Vue.…...

生命篇---心肺复苏、AED除颤仪使用、海姆立克急救法、常见情况急救简介

生命篇—心肺复苏、AED除颤仪使用、海姆立克急救法、常见情况急救简介 文章目录 生命篇---心肺复苏、AED除颤仪使用、海姆立克急救法、常见情况急救简介一、前言二、急救1、心肺复苏&#xff08;CPR&#xff09;&#xff08;1&#xff09;适用情况&#xff08;2&#xff09;操作…...

C++Cherno 学习笔记day19 [76]-[80] std::optional、variant、any

b站Cherno的课[76]-[80] 一、如何处理OPTIONAL数据 std::optional二、单一变量存放多类型的数据 std::variant三、如何存储任意类型的数据 std::any四、如何让C运行得更快五、如何让C字符串更快 一、如何处理OPTIONAL数据 std::optional std::optional C17 数据是否存在是可选…...

【Python Requests 库详解】

目录 简介一、安装与导入安装导入 二、发送 HTTP 请求1. GET 请求基本请求URL 参数 2. POST 请求表单数据提交JSON 数据提交文件上传 3. 其他方法PUT 请求示例DELETE 请求示例 三、处理响应1. 响应内容解析文本内容处理二进制内容处理JSON 数据处理 2. 响应状态与头信息状态码检…...

二维偏序-蓝桥20102,没写完

代码&#xff1a; 暴力&#xff1a;只过了35%,双重for循环o(n^2)1e10; #include <iostream> #include <bits/stdc.h> using namespace std; const int N1e910; typedef long long LL; typedef pair<int,int> PII;int main() {// 请在此输入您的代码//相当于…...

ASEG的鉴定

等位基因特异性表达(Allele-Specific Expression, ASE)基因的鉴定是研究杂种优势和基因表达调控的重要手段。以下是鉴定ASE基因的详细流程和方法: ### **1. 实验设计与样本准备** - **选择材料**:选择杂交种及其亲本作为研究材料。例如,玉米中的B73和Mo17及其杂交组合B73…...

从零开始:在 GrapesJS Style Manager 中新增 row-gap 和 column-gap

在前端开发中&#xff0c;页面样式的灵活性和可扩展性至关重要。GrapesJS 作为一个强大的网页构建工具&#xff0c;其内置的 Style Manager 提供了常见的 CSS 样式的可视化设置&#xff0c;极大地方便了开发者和设计师。然而&#xff0c;随着项目需求的不断变化&#xff0c;有些…...

解决双系统ubuntu24.04开机出现花屏等情况

1. 问题描述&#xff1a; 刚刚装上的双系统ubuntu24.04开机就出现花屏情况 2. 解决方案 安装显卡驱动 查看显卡型号 查看显卡硬件支持的驱动类型 ubuntu-drivers devices如果输入没有反映&#xff0c;请更新软件源&#xff0c;或者换官方软件源 sudo add-apt-repository…...

基于SpringBoot的智慧社区管理系统(源码+数据库)

499基于SpringBoot的智慧社区管理系统&#xff0c;系统包含三种角色&#xff1a;管理员、用户主要功能如下。 【用户功能】 1. 首页&#xff1a;查看系统。 2. 超市商品&#xff1a;浏览超市中各类商品信息。 3. 动物信息&#xff1a;了解社区内的动物种类和相关信息。 4. 车位…...

通俗理解CLIP模型如何实现图搜图乃至文搜图

一、图搜图与文搜图 图搜图和文搜图的场景相信大家并不少见&#xff0c;比如度娘的搜索框就可以直接上传图片找到相似的图片&#xff0c;还有某宝某团都有这种上传图片匹配到相似商品或者商品页的推荐的功能。那比如我想搜一张“正在跳舞的狗”的图片&#xff0c;是不是就能搜…...

谷歌最近放出大招——推出全新“Agent Development Kit(简称ADK)

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

std::string` 类

以下是对 std::string 类中 修改操作 和 字符串操作 的示例代码&#xff0c;帮助你更好地理解这些函数的使用&#xff1a; 5. 修改操作 (1) operator 用于追加字符串、C 风格字符串或字符。 #include <iostream> #include <string>int main() {std::string str …...

Sping Cloud配置和注册中心

1.Nacos实现原理了解吗&#xff1f; Nacos是注册中心&#xff0c;主要是帮助我们管理服务列表。Nacos的实现原理大概可以从下面三个方面来讲&#xff1a; 服务注册与发现&#xff1a;当一个服务实例启动时&#xff0c;它会向Nacos Server发送注册请求&#xff0c;将自己的信息…...

Java基础 - 泛型(常见用法)

文章目录 泛型类泛型方法泛型类派生子类示例 1&#xff1a;子类固定父类泛型类型&#xff08;StringBox 继承自 Box<String>&#xff09;示例 2&#xff1a;子类保留父类泛型类型&#xff08;AdvancedBox<T> 继承自 Box<T>)示例 3&#xff1a;添加子类自己的…...

待排序元素规模较小时,宜选取哪种排序算法效率最高

当待排序元素规模较小时&#xff0c;通常选择以下几种简单高效的排序算法&#xff0c;因为它们在小规模数据下具有更低的常数开销和良好的局部性表现&#xff1a; ✅ 插入排序&#xff08;Insertion Sort&#xff09; 推荐理由&#xff1a;在数据量小、数据部分有序的情况下&a…...

SAQ评级是什么,SAQ评级的意义?对企业发展好处

SAQ评级&#xff08;Supplier Audit Questionnaire&#xff0c;供应商审计问卷评级&#xff09;是供应链管理中常见的一种评估机制&#xff0c;主要用于对供应商的质量、合规性、风险管理能力等进行标准化审核和分级。它常见于汽车、电子、医药等对供应链要求严格的行业&#x…...

嵌入式---电机分类

一、按电流类型分类&#xff08;最基础分类&#xff09; 1. 直流电机&#xff08;DC Motor&#xff09; 工作原理&#xff1a;通过换向器&#xff08;有刷&#xff09;或电子换向&#xff08;无刷&#xff09;将直流电源转换为交变磁场&#xff0c;驱动转子旋转。 核心特点&a…...

定制一款国密浏览器(5):修改浏览器名称

在上一章中,我介绍了如何修改浏览器的 logo,这一章介绍修改浏览器的名称。 浏览器的名称是 AI 帮我想的,英文名 Mojo Browser,中文名墨舟浏览器。 第一步先修改 desktop 文件,desktop 文件支持多语言化,遵循 Freedesktop.org 制定的 Desktop Entry Specification 规范。…...

水库大坝安全监测系统

水库大坝安全监测系统是现代水利管理中至关重要的组成部分&#xff0c;是一种用于实时监控和评估大坝结构安全状况的技术系统&#xff0c;通过多种技术手段实现对水库大坝的全方位、全天候监测&#xff0c;旨在确保大坝的稳定性和安全性&#xff0c;预防潜在风险。 系统构成 …...

文件IO5(JPEG图像原理与应用)

JPEG图像原理与应用 ⦁ 基本概念 JPEG&#xff08;Joint Photographic Experts Group&#xff09;指的是联合图像专家组&#xff0c;是国际标准化组织ISO制订并于1992年发布的一种面向连续色调静止图像的压缩编码标准&#xff0c;所以也被称为JPEG标准。 同样&#xff0c;JP…...

开源Cursor替代品——Void

我原先写过很多关于Cursor文章。 今天分享一个开源的 Cursor 替代方案。 如果你也热爱开源项目,那么这篇文章正是为你准备的! 寻找开源替代的原因 我一直在思考:市面上这类产品层出不穷,但真正的核心技术似乎都依赖于大语言模型(LLM)。于是萌生了一个想法——何不自己…...

DAOS系统架构-组件

如上图所示&#xff0c;一个完整的DAOS系统是由管理节点组件、客户端节点组件、服务端节点组件以及网络通信组件四个部分组成。管理节点组件通过管理网络通道&#xff08;蓝色&#xff09;对DAOS服务管理和监控。客户端节点组件通过数据网络通道&#xff08;红色&#xff09;与…...

论文精读:MSCA-Net:多尺度上下文聚合网络在红外小目标检测中的突破

论文地址:https://arxiv.org/pdf/2503.17193 目录 一、论文结构解析 二、三大创新点详解 1. 多尺度增强检测注意力(MSEDA) 2. 位置卷积块注意力模块(PCBAM) 3. 通道聚合模块(CAB) 三、实验结果对比 定量分析(表I关键数据) 定性对比 四、应用场景展望 五、总…...

LangGraph 使用指南

安装配置 安装依赖 LangGraph 可以通过 pip 安装&#xff1a; pip install langgraph如果您想使用最新的功能和改进&#xff0c;可以从源代码安装&#xff1a; pip install githttps://github.com/langchain-ai/langgraph.git环境配置 LangGraph 与 LangChain 共享许多配置…...

C++指针(四)万字图文详解!

个人主页&#xff1a;PingdiGuo_guo 收录专栏&#xff1a;C干货专栏 前言 相关文章&#xff1a;C指针&#xff08;一&#xff09;、C指针&#xff08;二&#xff09;、C指针&#xff08;三&#xff09; 本篇博客是介绍函数指针、函数指针数组、回调函数、指针函数的。 点赞破六…...

【AI提示词】长期主义助手提供规划支持

提示说明 长期主义是一种关注长期利益和持续学习的思维模式&#xff0c;帮助个人和组织在快速变化的环境中保持耐心和系统性思考。 提示词 # Role: Long-termist Assistant## Profile - language: 中文 - description: 长期主义是一种关注长期利益和持续学习的思维模式&…...

JavaScript逆向工程:如何判断对称加密与非对称加密

在现代Web应用安全分析中&#xff0c;加密算法的识别是JavaScript逆向工程的关键环节。本文将详细介绍如何在逆向工程中判断JavaScript代码使用的是对称加密还是非对称加密。 一、加密算法基础概念 1. 对称加密 (Symmetric Encryption) 特点&#xff1a;加密和解密使用相同的…...

制造企业如何通过实现数据统一?

随着生产规模的扩大、供应链的复杂化以及市场需求的快速变化&#xff0c;企业内部的数据管理问题日益凸显。数据孤岛、数据冗余、数据不一致等问题不仅降低了运营效率&#xff0c;还可能导致决策失误。那么&#xff0c;制造企业如何才能打破这些壁垒&#xff0c;实现数据的统一…...

ICRA-2025 | 视觉预测助力机器人自主导航!NavigateDiff:视觉引导的零样本导航助理

论文&#xff1a;Yiran Qin 1 , 2 ^{1,2} 1,2, Ao Sun 2 ^{2} 2, Yuze Hong 2 ^{2} 2, Benyou Wang 2 ^{2} 2, Ruimao Zhang 1 ^{1} 1单位&#xff1a; 1 ^{1} 1中山大学&#xff0c; 2 ^{2} 2香港中文大学深圳校区论文标题&#xff1a;NavigateDiff: Visual Predictors are Ze…...

Java 与 LibreOffice 集成开发指南

1. 引言 Java 与 LibreOffice 的集成开发为开发者提供了一种强大的工具&#xff0c;用于实现文档自动化处理、文档转换、内容编辑等任务。通过 Java 调用 LibreOffice 提供的 API&#xff0c;可以实现跨平台的文档处理功能&#xff0c;满足各种业务需求。本文将详细介绍如何使…...

如果单表数据量大,只能考虑分库分表吗

程序员最怕啥?不是需求改八遍,也不是半夜报警电话,而是数据库突然卡成PPT!尤其是当单表数据冲到几千万行,查询慢得像老牛拉车,这时候团队第一反应往往是:“赶紧分库分表!” 但兄弟,分库分表可不是什么温柔小姐姐,它更像是个浑身带刺的仙人掌——你以为抱上就能解决问…...

3.3.1 spdlog异步日志

文章目录 3.3.1 spdlog异步日志1. spdlog1. 日志作用2 .同步日志和异步日志区别 2. spdlog是什么下载命令&#xff1a;2. spdlog为什么高效3. spdlog特征5. spdlog输出控制6. 处理流程7. 文件io8.问题 2. 如何创建logger3. 如何创建sink4. 如何自定义格式化5. 如何创建异步日志…...

【Web功能测试】注册与登录功能测试用例设计深度解析

1 注册功能测试用例设计 1.1 明确需求与测试范围 必填字段&#xff1a;手机号、验证码、密码 手机号规则&#xff1a;11位手机号 密码规则&#xff1a;6-16位&#xff0c;需包含大小写字母必须同时存在&#xff0c;数字或符号存在其一 协议勾选 提交后跳转登录页或显示成功…...

netstat 查看端口占用、杀死进程

文章目录 查看端口占用强制杀死 报错信息使用 lsof 查看端口占用 netstat -tanlp强制杀死 在安全的情况下&#xff0c;用下面命令杀死端口占用的进程 sudo kill $(sudo lsof -t -i:3128)报错信息 部署程序时&#xff0c;会出现这样的报错&#xff1a; Error response from…...

Windows 11 PowerShell重定向文本文件的编码问题

目录 问题的由来 编码导致的问题 解决办法 VSCode进行转换 记事本进行转换 直接指定输出的文本编码 总结 问题的由来 在我的嵌入式系统的课程中有一个裸机开发的实验&#xff0c;其中需要把图片等文件转换为C语言数组保存在程序中。课程中&#xff0c;我推荐了CodePlea的…...

蓝桥杯冲刺:一维差分

系列文章目录 蓝桥杯系列&#xff1a;一维差分 文章目录 系列文章目录前言一、一维差分&#xff1a; 差分数组的意义&#xff1a; 二、差分的性质&#xff1a; 差分和前缀和的关系 三、一维差分代码实现&#xff1a;四、典型真题&#xff08;利用一维差分来实现&#xff09; 这…...

理解企业内部信息集成

目录 1. 技术平台集成 2. 数据集成 3. 应用集成 4. 业务过程集成 5. 应用集成与企业内部信息集成的区别 企业内部信息集成是将分散的技术、数据、应用和业务流程整合为一个协同的整体&#xff0c;以提高效率、减少冗余和增强决策能力。 企业内部信息集成一般可以分为4个方…...

论文学习:《利用图注意力网络增强单细胞多组学数据的整合》

原文标题&#xff1a;Enhanced Integration ofSingle-Cell Multi-Omics Data Using Graph Attention Networks 原文链接&#xff1a;https://pubs.acs.org/doi/abs/10.1021/acssynbio.4c00864 跨不同组学层的数据集成面临的挑战&#xff1a;高维度、异质性和稀疏性。 变分自编码…...

HumanDil-Ox-LDL:保存:2-8℃保存,避免强光直射,不可冻存

化学试剂的基本介绍&#xff1a; /// 英文名称&#xff1a;HumanDil-Oxidized LowDensityLipoprotein /// 中文名称&#xff1a;人源红色荧光标记氧化型低密度脂蛋白 /// 浓度&#xff1a;1.0-4.0 mg/ml /// 外观&#xff1a;乳状液体 /// 缓冲液组分&#xff1a;PBS&…...

基于3d相机的点云物体检测与路径规划

&#x1f9e9; 代码结构和解释&#xff1a; 点云预处理 (preprocess_point_cloud)&#xff1a; 使用 Voxel 下采样 来减少点云数据量&#xff0c;去除不必要的噪声。 使用 统计滤波器 去除离群点&#xff0c;以提高后续拟合的精度。 V型焊缝路径拟合 (fit_weld_path_v)&…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(2):んです

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(2):んです 1、前言(1)情况说明(2)工程师的信仰2、知识点(1)~んです & ~の(2)意味(いみ)&形(かたち)&使い方(つかいかた)(3)そうなんですか & そうなんだ。(4)何をしているんですか & 何を…...

yolov8在windows系统的C++版本的onnxruntime部署方法

1.各个软件的的环境需要保持在统一的版本。 onnxruntime需要和cuda的版本对应上,版本号:onnxruntime-win-x64-gpu-1.18.1 ,链接: NVIDIA - CUDA | onnxruntime cuda:本机显卡支持的版本,cuda11.7,链接:CUDA Toolkit Archive | NVIDIA Developer cudnn:需要对应到cud…...

AD软件的系统设置

设置 1.自动保存&#xff08;DATA -> backup&#xff09; 2.原理图-复制元器件递增位号 3.原理图-用斜线表示负信号 4.PCB-选择移动重叠的元器件 5.PCB-十字光标全屏大小 6.PCB-选择部分连接网络的走线全亮/显示多个网络的颜色&#xff08;TP&#xff09; 7.PCB-DRC报错的图…...

算法---子序列[动态规划解决](最长递增子序列)

最长递增子序列 说白了&#xff0c;要用到双层循环&#xff01; 用双层循环中的dp[i] class Solution { public:int lengthOfLIS(vector<int>& nums) {vector<int> dp(nums.size(),1);for(int i 0;i<nums.size();i){for(int j0;j<i;j){if(nums[i]>num…...

快速幂(模板)

快速幂 取余运算性质&#xff1a;(a*b*c)%d (a%d * b%d * c%d)%d ; #include <iostream> using namespace std; int main() {long long b,p,k;//b(底数)p(指数)k(取模数)cin>>b>>p>>k;long long ret1;b%k;//防止底数过大//模版&#xff0c;记&#xf…...

蓝桥杯 好数【暴力、基础知识】

题目&#xff1a; AC代码&#xff1a; #include<bits/stdc.h> using namespace std; int ans0; int n; bool check(int x){int cnt1;while(x!0){int tx%10;if(cnt%21){ if(t%20) return false; //奇数位置是偶数} if(cnt%20){if(t%21) return false; //偶数位是奇数}cnt…...

【Kubernetes】Kubernetes中如何实现灰度发布

Kubernetes中实现灰度发布 一、基于Ingress-nginx的流量切分&#xff08;适用中小规模&#xff09; 权重分流 在Ingress资源中通过nginx.ingress.kubernetes.io/canary-weight注解设置新版本流量比例apiVersion: networking.k8s.io/v1 kind: Ingress metadata:annotations:ng…...

【Reinforcement Learning For Quadruped Control】1

强化学习&#xff08;RL&#xff09;是一种机器学习范式&#xff0c;代理通过与环境的互动来学习做出决策。强化学习的核心概念围绕以下几个方面展开&#xff1a;a) 代理agent&#xff0c;做出决策&#xff1b;b) 环境environment&#xff0c;响应代理的决策&#xff1b;c) 状态…...