算法基础第四讲 数据结构
单调栈什么是单调栈单调栈顾名思义就是具有单调性的栈。它依旧是⼀个栈结构只不过⾥⾯存储的数据是递增或者递减的。这种结构是很容易实现的如下⾯的代码但重点是维护⼀个单调栈的意义是什么#includeiostream#includestackusingnamespacestd;constintN3e610;inta[N],n;voidtest1(){stackintst;// 维护⼀个单调递增的栈for(inti1;in;i){// 栈⾥⾯⼤于等于 a[i] 的元素全部出栈while(st.size()st.top()a[i])st.pop();st.push(a[i]);}}voidtest2(){stackintst;// 维护⼀个单调递减的栈for(inti1;in;i){// 栈⾥⾯⼩于等于 a[i] 的元素全部出栈while(st.size()st.top()a[i])st.pop();st.push(a[i]);}}单调栈解决的问题单调栈能帮助我们解决以下四个问题• 寻找当前元素左侧离它最近并且⽐它⼤的元素在哪• 寻找当前元素左侧离它最近并且⽐它⼩的元素在哪• 寻找当前元素右侧离它最近并且⽐它⼤的元素在哪• 寻找当前元素右侧离它最近并且⽐它⼩的元素在哪。虽然是四个问题但是原理是⼀致的。因此只要解决⼀个举⼀反三就可以解决剩下的⼏个。寻找当前元素左侧离它最近并且⽐它⼤的元素在哪从左往右遍历元素构造⼀个单调递减的栈。插⼊当前位置的元素的时• 如果栈为空则左侧不存在⽐当前元素⼤的元素• 如果栈⾮空插⼊当前位置元素时的栈顶元素就是所找的元素。注意因为我们要找的是最终结果的位置。因此栈⾥⾯存的是每个元素的下标。寻找当前元素左侧离它最近并且⽐它⼩的元素在哪从左往右遍历元素构造⼀个单调递增的栈。插⼊当前位置的元素的时• 如果栈为空则左侧不存在⽐当前元素⼩的元素• 如果栈⾮空插⼊当前位置元素时的栈顶元素就是所找的元素。注意因为我们要找的是最终结果的位置。因此栈⾥⾯存的是每个元素的下标。针对其余两种情况我们仅需逆序遍历数组即可。5. 寻找当前元素右侧离它最近并且⽐它⼤的元素在哪从右往左遍历元素构造⼀个单调递减的栈。插⼊当前位置的元素的时• 如果栈为空则左侧不存在⽐当前元素⼤的元素• 如果栈⾮空插⼊当前位置元素时的栈顶元素就是所找的元素。注意因为我们要找的是最终结果的位置。因此栈⾥⾯存的是每个元素的下标。#includeiostream#includestackusingnamespacestd;constintN3e610;inta[N],n;intret[N];voidtest(){stackintst;// 维护⼀个单调递减的栈for(intin;i1;i--){// 栈⾥⾯⼩于等于 a[i] 的元素全部出栈while(st.size()a[st.top()]a[i])st.pop();// 此时栈顶元素存在栈顶元素就是所求结果if(st.size())ret[i]st.top();st.push(i);// 存的是下标}for(inti1;in;i){coutret[i] ;}coutendl;}intmain(){cinn;for(inti1;in;i)cina[i];test();coutendl;return0;}寻找当前元素右侧离它最近并且⽐它⼩的元素在哪从右往左遍历元素构造⼀个单调递增的栈。插⼊当前位置的元素的时• 如果栈为空则左侧不存在⽐当前元素⼩的元素• 如果栈⾮空插⼊当前位置元素时的栈顶元素就是所找的元素。注意因为我们要找的是最终结果的位置。因此栈⾥⾯存的是每个元素的下标。#includeiostream#includestackusingnamespacestd;constintN3e610;inta[N],n;intret[N];voidtest(){stackintst;// 维护⼀个单调递增的栈for(intin;i1;i--){// 栈⾥⾯⼤于等于 a[i] 的元素全部出栈while(st.size()a[st.top()]a[i])st.pop();// 此时栈顶元素存在栈顶元素就是所求结果if(st.size())ret[i]st.top();st.push(i);// 存的是下标}for(inti1;in;i){coutret[i] ;}coutendl;}intmain(){cinn;for(inti1;in;i)cina[i];test();coutendl;return0;}单调队列什么是单调队列单调队列顾名思义就是存储的元素要么单调递增要么单调递减的队列。注意这⾥的队列和普通的队列不⼀样是⼀个双端队列。单调队列解决的问题⼀般⽤于解决滑动窗⼝内最⼤值最⼩值问题以及优化动态规划。P1886 【模板】单调队列 / 滑动窗口题目描述有一个长为nnn的序列aaa以及一个大小为kkk的窗口。现在这个窗口从左边开始向右滑动每次滑动一个单位求出每次滑动后窗口中的最小值和最大值。例如对于序列[1,3,−1,−3,5,3,6,7][1,3,-1,-3,5,3,6,7][1,3,−1,−3,5,3,6,7]以及k3k 3k3有如下过程窗口位置最小值最大值[1 3 -1] -3 5 3 6 7 −13 1 [3 -1 -3] 5 3 6 7 −33 1 3 [-1 -3 5] 3 6 7 −35 1 3 -1 [-3 5 3] 6 7 −35 1 3 -1 -3 [5 3 6] 7 36 1 3 -1 -3 5 [3 6 7]37\def\arraystretch{1.2} \begin{array}{|c|c|c|}\hline \textsf{窗口位置} \textsf{最小值} \textsf{最大值} \\ \hline \verb![1 3 -1] -3 5 3 6 7 ! -1 3 \\ \hline \verb! 1 [3 -1 -3] 5 3 6 7 ! -3 3 \\ \hline \verb! 1 3 [-1 -3 5] 3 6 7 ! -3 5 \\ \hline \verb! 1 3 -1 [-3 5 3] 6 7 ! -3 5 \\ \hline \verb! 1 3 -1 -3 [5 3 6] 7 ! 3 6 \\ \hline \verb! 1 3 -1 -3 5 [3 6 7]! 3 7 \\ \hline \end{array}窗口位置[1 3 -1] -3 5 3 6 71 [3 -1 -3] 5 3 6 71 3 [-1 -3 5] 3 6 71 3 -1 [-3 5 3] 6 71 3 -1 -3 [5 3 6] 71 3 -1 -3 5 [3 6 7]​最小值−1−3−3−333​最大值335567​​输入格式输入一共有两行第一行有两个正整数n,kn,kn,k第二行有nnn个整数表示序列aaa。输出格式输出共两行第一行为每次窗口滑动的最小值第二行为每次窗口滑动的最大值。输入输出样例 #1输入 #18 3 1 3 -1 -3 5 3 6 7输出 #1-1 -3 -3 -3 3 3 3 3 5 5 6 7说明/提示【数据范围】对于50%50\%50%的数据1≤n≤1051 \le n \le 10^51≤n≤105对于100%100\%100%的数据1≤k≤n≤1061\le k \le n \le 10^61≤k≤n≤106ai∈[−231,231)a_i \in [-2^{31},2^{31})ai​∈[−231,231)。#includeiostream#includedequeusingnamespacestd;constintN1e610;intn,k;inta[N];intmain(){cinnk;for(inti1;in;i)cina[i];dequeintq;// 存下标// 窗⼝内最⼩值 - 单调递增的队列 - 存下标for(inti1;in;i){while(q.size()a[q.back()]a[i])q.pop_back();q.push_back(i);// 判断队列⾥⾯元素是否在合法窗⼝内if(q.back()-q.front()1k)q.pop_front();if(ik)couta[q.front()] ;}coutendl;// 窗⼝内最⼤值 - 单调递减的队列 - 存下标q.clear();for(inti1;in;i){while(q.size()a[q.back()]a[i])q.pop_back();q.push_back(i);if(q.back()-q.front()1k)q.pop_front();if(ik)couta[q.front()] ;}coutendl;return0;}并查集3.1 双亲表⽰法接下来要学习到的并查集本质上就是⽤双亲表⽰法实现的森林。因此我们先认识⼀下双亲表⽰法。在学习树这个数据结构的时讲到树的存储⽅式有很多种孩⼦表⽰法双亲表⽰法、孩⼦双亲表⽰法以及孩⼦兄弟表⽰法等。对⼀棵树⽽⾔除了根节点外其余每个结点⼀定有且仅有⼀个双亲双亲表⽰法就是根据这个特点存储树的也就是把每个结点的双亲存下来。因此我们可以采⽤数组来存储每个结点的⽗亲结点的编号这就实现了双亲表⽰法(so easy)。但是在实现并查集的时我们⼀般让根节点⾃⼰指向⾃⼰。因此上述存储就变成3.2 并查集的概念在有些问题中我们需要维护若⼲个集合并且基于这些集合要频繁执⾏下⾯的操作• 查询操作查找元素 属于哪⼀个集合。⼀般会在每个集合中选取⼀个元素作为代表查询的是x这个集合中的代表元素x• 合并操作将元素 所在的集合与元素 所在的集合合并成⼀个集合注意合并的是元素所x在的集合不是这两个元素 x y• 判断操作判断元素 x 和 y 是否在同⼀个集合。并查集Union Find是⼀种⽤于维护元素所属集合的数据结构实现为⼀个森林其中每棵树表⽰⼀个集合树中的节点表⽰对应集合中的元素根节点来代表整个集合。3.3 并查集的实现3.3.1 初始化初始状态下所有的元素单独成为⼀个集合• 让元素⾃⼰指向⾃⼰即可。constintN1e610;intn;intfa[N];// 双亲表⽰法所需的数组// 初始化并查集voidinit(){for(inti1;in;i)fa[i]i;}3.3.2 查询操作查询操作是并查集的核⼼操作其余所有的操作都是基于查询操作实现的找到元素 x 所属的集合• ⼀直向上找爸爸// 查询操作intfind(intx){if(fa[x]x)returnx;returnfind(fa[x]);// ⼀⾏实现returnfa[x]x?x:find(fa[x]);}3.3.3 合并操作将元素 x 所在的集合与元素 y 所在的集合合并成⼀个集合• 让元素 x 所在树的根节点指向元素 y 所在树的根节点。反过来也是可以的代// 合并操作voidun(intx,inty)// 注意函数名字不能⽤ union因为它是 C 的关键字{intfxfind(x);intfyfind(y);fa[fx]fy;}3.3.4 判断操作判断元素 x 和元素 y 是否在同⼀集合• 看看两者所在树的根节点是否相同。// 判断是否在同⼀集合boolissame(intx,inty){returnfind(x)find(y);}3.4 并查集的优化极端情况在合并的过程中整棵树变成⼀个链表。路径压缩在查询时把被查询的节点到根节点的路径上的所有节点的⽗节点设置为根节点从⽽减⼩树的深度。也就是说在向上查询的同时把在路径上的每个节点都直接连接到根上以后查询时就能直接查询到根节点。// 找根节点 - 路径压缩intfind(intx){if(fa[x]x)returnx;returnfa[x]find(fa[x]);// ⼀⾏实现returnfa[x]x?x:fa[x]find(fa[x]);}还有⼀种优化⽅式是按秩合并但是基本上不⽤按秩合并并查集的时间复杂度就很优秀了。感兴趣的同学可以搜⼀下按秩合并按照⼤家现在的⽔平应该很容易就能看懂~在《算法导论》中有严格的证明并查集查询根节点的最坏时间复杂度为 是⼀个很⼩的常数。因此并查集查询以及合并的效率近似可以看成 。3.6 扩展域并查集普通的并查集只能解决各元素之间仅存在⼀种相互关系⽐如《亲戚》题⽬中• a 和 b 是亲戚关系 b 和 c 是亲戚关系这时就可以查找出 a 和 c 也存在亲戚关系。但如果存在各元素之间存在多种相互关系普通并查集就⽆法解决。⽐如下⾯的案例• 和 是敌⼈关系 和 是敌⼈关系但是 和 其实不是敌⼈关系⽽是另⼀种朋友关系。a b b c a c此时就不仅仅是简单的敌⼈关系还是出现⼀种朋友关系。解决这类问题就需要对并查集进⾏扩展将每个元素拆分成多个域每个域代表⼀种状态或者关系。通过维护这些域之间的关系来处理复杂的约束条件。敌⼈朋友问题中我们会将 x 分成两个域朋友域 x 以及敌⼈域 y • x 和 y 是朋友正常处理把 x 和 y 合并成⼀个集合• 和 是敌⼈那么 和 的敌⼈ 就是朋友合并 与 和 的敌⼈就是朋友合并 与 。x y x y y n x y n y xx n y x n这样就可以利⽤两个域将所有的关系维护起来。3.7 带权并查集带权并查集的概念带权并查集在普通并查集的基础上为每个结点增加了⼀个权值。这个权值可以表⽰当前结点与⽗结点之间的关系、距离或其他信息注意由于我们有路径压缩操作所以最终这个权值表⽰的是当前结点相对于根结点的信息。有了这样⼀个权值就可以推断出集合中各个元素之间的相互关系。带权并查集的实现我们以最简单的距离问题为例实现⼀个能够查询任意两点之间距离的并查集。实现带权并查集的核⼼是在进⾏ Find 和 Union 操作时不仅要维护集合的结构还要维护结点的权值。注意带权并查集的实现是多种多样的基本上换⼀道题实现的代码就要更改。因此⼀定要重点关注实现过程的思考⽅式这才是通⽤的。初始化 init constintN1e510,INF0x3f3f3f3f;intn;intfa[N],d[N];voidinit(){for(inti1;in;i){fa[i]i;d[i]0;// 根据题⽬要求来初始化}}intfind(intx){if(fa[x]x)returnx;inttfind(fa[x]);// 这句代码⼀定要先执⾏先让⽗结点挂在根节点的后⾯d[x]d[fa[x]];// 注意可能会根据权值的意义有所改变returnfa[x]t;}// x 所在集合与 y 所在集合合并x 与 y 之间的权值是 wvoidun(intx,inty,intw){intfxfind(x),fyfind(y);if(fx!fy)// 不在同⼀个集合中{fa[fx]fy;d[fx]d[y]w-d[x];// 注意可能会根据权值的意义有所改变}}// 查询 x 到 y 的距离intquery(intx,inty){intfxfind(x),fyfind(y);if(fx!fy)returnINF;// 如果不在同⼀个集合中说明距离未知returnd[y]-d[x];}字符串哈希回忆哈希函数与哈希冲突• 哈希函数将关键字映射成对应的地址的函数记为 Hash(key) Addr 。• 哈希冲突哈希函数可能会把两个或两个以上的不同关键字映射到同⼀地址这种情况称为哈希冲突。字符串哈希定义⼀个把字符串映射到整数的函数 这就是字符串哈希。说⽩了就是将⼀个字符串⽤⼀个整数表⽰。hash字符串哈希中的哈希函数在字符串哈希中有⼀种冲突概率较⼩的哈希函数将字符串映射成 p 进制数字hash(s) s[i] × p (i0∑n−1n−i−1 mod M)其中 通常取质数 或者 。如果把哈希值定义为 unsigned long long 类型在C 中溢出就会⾃动取模。p 131 13331你没有看错字符串哈希就是背⼀个公式即可…但是实际求哈希值时我们⽤的是前缀哈希的思想来求这样会和下⾯的多次询问⼦串哈希⼀致。前缀哈希数组单次计算⼀个字符串的哈希值复杂度是 。如果需要多次询问⼀个字符串的⼦串的哈希值每次重新计算效率⾮常低下。O(N)⼀般利⽤前缀和思想先预处理字符串中每个前缀的哈希值这样的话每次就能快速求出⼦串的哈希了。Trie 树字典树的概念Trie 树⼜叫字典树或前缀树是⼀种能够快速插⼊和查询字符串的数据结构。它利⽤字符串的公共前缀将字符串组织成⼀棵树形结构从⽽⼤ 提⾼了存储以及查找效率。我们可以把字典树想象成⼀棵多叉树每⼀条边代表⼀个字符从根节点到某个节点的路径就代表了⼀个字符串。例如要存储 “abc” 、 “abd” 、 “acde” 以及 “cd” 时构建的字典树如下字典树的作⽤当我们在字典树的每⼀个结点位置额外维护⼀些信息时就可以做到很多事情• 查询某个单词是否出现过并且出现⼏次• 查询有多少个单词是以某个字符串为前缀• 查询所有以某个前缀开头的单词这个作⽤可以⽤到输⼊法中输⼊拼⾳的时候可以提⽰可能的单词当然除了上述作⽤以外字典树还可以解决别的问题后续可以在做题中体会。字典树的实现实现⼀个能够查询单词出现次数以及查询有多少个单词是以某个字符串为前缀的字典树默认全是⼩写字⺟。

相关新闻

具身智能TVA-VLA实现开放环境常识推理突破

具身智能TVA-VLA实现开放环境常识推理突破

前沿技术探索:TVA智能体(简称TVA)TVA智能体(亦称“AI智能体视觉”或“TVA视觉智能体”)是依托Transformer架构与“因式智能体”理论构建的系统级视觉技术框架。它融合深度强化学习(DRL)、卷积神…

2026/8/26 19:07:49 阅读更多 →
前瞻性应用场景——长期愿景

前瞻性应用场景——长期愿景

前瞻性应用场景——长期愿景 最后一个层级涉及装配时间较长(每台十分钟或以上)且高变异的机器或设备的自动化装配。在此类环境中,人形机器人需要自主解读装配图纸、执行多步骤序列、识别正确零部件并完成相应的装配操作。 达到这一自主水平&a…

2026/8/26 19:07:49 阅读更多 →
[光学原理与应用-550]:非线性光学的两大湮灭机制:向外新生的倍频,向内跃迁的吸收

[光学原理与应用-550]:非线性光学的两大湮灭机制:向外新生的倍频,向内跃迁的吸收

非线性光学的两大湮灭机制:向外新生的倍频,向内跃迁的吸收线性光学定义了光的“常态”:光线穿过介质,仅改变传播方向、相位与偏振,光子数量、频率、能量始终恒定,光束之间互不干扰,全程稳定且守…

2026/8/26 19:07:49 阅读更多 →

最新新闻

动态规划算法:核心思想与面试实战指南

动态规划算法:核心思想与面试实战指南

1. 动态规划:算法面试的必杀技 第一次接触动态规划是在大三的算法课上,教授在黑板上写下"Fibonacci数列"几个大字时,我完全没意识到这将是我算法学习路上最重要的转折点。直到后来参加校招面试,被面试官连续追问三道动态…

2026/8/26 20:50:05 阅读更多 →
软件定义无线电SDR入门:原理、硬件选型与实战项目详解

软件定义无线电SDR入门:原理、硬件选型与实战项目详解

说到软件定义无线电(Software-Defined Radios,简称SDR),很多朋友第一反应是“这东西太硬核了,适合专业人士”。但我玩下来最大的感受是:它可能是无线电圈子里最容易上手、最“性价比”的数码玩具&#xff0…

2026/8/26 20:50:05 阅读更多 →
Python纯文件图书馆系统:零数据库的轻量级实现方案

Python纯文件图书馆系统:零数据库的轻量级实现方案

1. 项目概述:为什么用纯文件存储做图书馆系统,而不是数据库?“Python实现图书馆借阅管理系统-文件存储”——这个标题里藏着一个被很多人忽略的关键判断:不用SQLite、不连MySQL、不碰MongoDB,就靠.txt、.json甚至.csv这…

2026/8/26 20:50:05 阅读更多 →
TrustZone-M深度解析:Cortex-M核心的安全世界与工程实践

TrustZone-M深度解析:Cortex-M核心的安全世界与工程实践

如果你跟我一样,接手过一个号称“带 TrustZone-M 的 ARM Cortex-M 核心”的 IoT 项目,大概率会有一个共同困惑:TrustZone-M 到底在哪里?是编译器选项,还是芯片寄存器?是烧录分区,还是某个 SDK 里…

2026/8/26 20:50:05 阅读更多 →
C盘文件怎么安全移到D盘?学会这招路径重定向搬家不翻车

C盘文件怎么安全移到D盘?学会这招路径重定向搬家不翻车

很多人在 C 盘爆满时的第一反应,就是把大文件夹直接拖拽到 D 盘。结果往往是软件打不开、快捷方式全白板、注册表报错一连串。究其原因,Windows 下程序安装并不像 macOS 那样整齐,它会把路径信息分散塞进快捷方式、注册表和各种配置文件中。你…

2026/8/26 20:50:05 阅读更多 →
llama.cpp在3090上部署Qwen3.8-27B

llama.cpp在3090上部署Qwen3.8-27B

1 unsloth/Qwen3.8-27B-GGUF at main 最高画质4bit量化 2 ./llama-server -m ..\models\Qwen3.8-27B-UD-Q4_K_XL.gguf --mmproj ..\models\mmproj-Qwen3.8-27B-Uncensored-HauhauCS-Aggressive-BF16.gguf -ngl 999 -fa on -c 65536 -ctk q4_0 -ctv q4_0 -b 2048 -ub 512 --te…

2026/8/26 20:49:05 阅读更多 →

日新闻

Python random 模块常用函数详解:从入门到实战

Python random 模块常用函数详解:从入门到实战

目录 1. 引言2. 准备工作3. 基础随机函数4. 序列相关函数5. 随机种子与复现6. 实战案例7. 注意事项8. 常见问题与排查9. 总结 1. 引言 摘要: 本文系统介绍 Python 标准库 random 模块中最常用的随机数生成函数。内容涵盖基础随机函数(random()、unifor…

2026/8/26 0:00:40 阅读更多 →
《Microsoft Sql server 2008 Internals》读书笔记--第三章Databases and Database Files(2)

《Microsoft Sql server 2008 Internals》读书笔记--第三章Databases and Database Files(2)

《Microsoft Sql server 2008 Internals》索引目录: 《Microsoft Sql server 2008 Internals》读书笔记--目录索引 在上篇文章中,主要介绍了创建数据库的基本语法和FileGroup的初步知识。需要注意的是: 关于FileGroup 如果你的系统是用Raid设备直接存…

2026/8/26 1:18:18 阅读更多 →
政务AI智能体怎么建?三种模式、三步路径与四个误区

政务AI智能体怎么建?三种模式、三步路径与四个误区

政务AI智能体已经从概念试点阶段,转入了政务服务的常态化落地应用;在实际使用过程中,它能自主理解办事需求、辅助完成填报申报、开展材料预审,并联动多个系统协同作业,真正嵌入到政务办理的全流程当中。但在落地推进过…

2026/8/26 1:18:18 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/26 14:45:33 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/26 17:46:43 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/26 14:46:37 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/26 3:50:20 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/26 17:46:39 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/26 1:24:05 阅读更多 →