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

【优选算法篇】双指针的华丽探戈:深入C++算法殿堂的优雅追寻

文章目录

  • C++ 双指针详解:进阶题解与思维分析
    • 前言
    • 第一章:有效三角形的个数
      • 1.1 有效三角形的个数
        • 示例 1:
        • 示例 2:
        • 解法一(暴力求解)
        • 解法二(排序 + 双指针)
        • 易错点提示
        • 代码解读
    • 第二章:和为 s 的两个数字
      • 2.1 和为 s 的两个数字
        • 示例 1:
        • 解法一(暴力解法)
        • 解法二(双指针 - 对撞指针)
    • 第三章:三数之和与四数之和
      • 3.1 三数之和
        • 示例 1:
        • 示例 2:
        • 示例 3:
        • 提示:
        • 解法(排序+双指针)
      • 3.2 四数之和
        • 示例 1:
        • 示例 2:
        • 提示:
        • 解法(排序 + 双指针)
    • 写在最后

C++ 双指针详解:进阶题解与思维分析

💬 欢迎讨论:如有疑问或见解,欢迎在评论区留言互动。

👍 点赞、收藏与分享:如觉得这篇文章对您有帮助,请点赞、收藏并分享!
🚀 分享给更多人:欢迎分享给更多对 C++ 感兴趣的朋友,一起学习双指针的基础与进阶!


前言

接上篇【优选算法篇】双指针的优雅舞步:C++ 算法世界的浪漫探索

本篇文章将带领大家进入双指针的进阶领域。在基础篇中,我们已经学习了如何利用双指针优化简单数组问题,而在这一篇中,我们将进一步深入探讨双指针的高级应用场景,包括排序问题、多数之和等经典题型的双指针解法,以及如何利用双指针快速解决复杂的数组与链表问题。

通过更加深入的题目分析和双指针的高级策略,我们希望大家能够更加熟练地运用这一算法技巧,应对更具挑战性的编程问题。让我们继续双指针的优雅舞步,开启 C++ 算法世界的浪漫探索!


第一章:有效三角形的个数

1.1 有效三角形的个数

题目链接:611. 有效三角形的个数
题目描述:给定一个包含非负整数的数组 nums,返回其中可以组成三角形三条边的三元组个数。

示例 1:
  • 输入:nums = [2, 2, 3, 4]
  • 输出:3
  • 解释:有效的组合是:
    • 2, 3, 4 (使用第一个 2)
    • 2, 3, 4 (使用第二个 2)
    • 2, 2, 3
示例 2:
  • 输入:nums = [4, 2, 3, 4]
  • 输出:4
  • 解释:
    • 4, 2, 3
    • 4, 2, 4
    • 4, 3, 4
    • 2, 3, 4

解法一(暴力求解)

算法思路

  • 三层 for 循环枚举出所有的三元组,并判断是否能构成三角形。
  • 判断三角形的优化:
    • 如果能构成三角形,需要满足任意两边之和大于第三边。但实际上只需让较小的两条边之和大于第三边即可。
    • 因此可以先将原数组排序,然后从小到大枚举三元组,一方面省去枚举的数量,另一方面方便判断是否能构成三角形。

代码实现

class Solution {
public:int triangleNumber(vector<int>& nums) {// 1. 排序sort(nums.begin(), nums.end());int n = nums.size(), ret = 0;// 2. 从小到大枚举所有的三元组for (int i = 0; i < n; i++) {for (int j = i + 1; j < n; j++) {for (int k = j + 1; k < n; k++) {// 当最小的两个边之和大于第三边的时候,统计答案if (nums[i] + nums[j] > nums[k])ret++;}}}return ret;}
};

复杂度分析

  • 时间复杂度O(n^3),对于较大的输入,三层循环会导致性能问题,适合小规模数据。
  • 空间复杂度O(1),只使用了常数个变量存储结果和中间值。

解法二(排序 + 双指针)

算法思路

  • 先将数组排序。
  • 根据「解法一」中的优化思想,可以固定一个「最长边」,然后在比这条边小的有序数组中找出一个二元组,使这个二元组之和大于这个最长边。由于数组是有序的,我们可以利用「对撞指针」来优化。
  • 设最长边枚举到位置 i,区间 [left, right]i 位置左边的区间(也就是比它小的区间):
    • 如果 nums[left] + nums[right] > nums[i]
      • 说明 [left, right - 1] 区间上的所有元素均可以与 nums[right] 构成比 nums[i] 大的二元组。
      • 满足条件的有 right - left 种。
      • 此时 right 位置的元素的所有情况相当于全部考虑完毕,right--,进入下一轮判断。
    • 如果 nums[left] + nums[right] <= nums[i]
      • 说明 left 位置的元素不可能与 [left + 1, right] 位置上的元素构成满足条件的二元组。
      • left 位置的元素可以舍去,left++ 进入下一轮循环。

代码实现

class Solution {
public:int triangleNumber(vector<int>& nums) {// 1. 排序sort(nums.begin(), nums.end());// 2. 利用双指针解决问题int ret = 0, n = nums.size();for (int i = n - 1; i >= 2; i--) { // 先固定最大的数// 利用双指针快速统计符合要求的三元组的个数int left = 0, right = i - 1;while (left < right) {if (nums[left] + nums[right] > nums[i]) {ret += right - left;right--;} else {left++;}}}return ret;}
};

复杂度分析

  • 时间复杂度O(n^2),排序的时间复杂度为 O(n log n),之后每个元素使用双指针进行一次遍历,时间复杂度为 O(n^2)
  • 空间复杂度O(1),只使用了常数个变量存储结果和指针位置。

易错点提示
  1. 指针移动逻辑:在双指针遍历时,根据条件选择移动 leftright,确保找到所有满足条件的三元组。
  2. 数组排序:在开始双指针遍历之前,必须对数组进行排序,否则无法保证正确性。
  3. 三角形判定条件:确保只需判断两边之和是否大于第三边,简化条件判断,避免遗漏有效三元组。

代码解读

该算法的时间复杂度为 O(n^2),空间复杂度为 O(1),适合大规模输入。通过排序和双指针优化,能够有效减少暴力求解中的不必要计算,提升性能。此方法非常适合在数组问题中应用,能够快速找到所有满足条件的组合。


第二章:和为 s 的两个数字

2.1 和为 s 的两个数字

题目链接:剑指 Offer 57. 和为s的两个数字
题目描述:输入一个递增排序的数组和一个数字 s,在数组中查找两个数,使得它们的和正好是 s。如果有多对数字的和等于 s,则输出任意一对即可。

示例 1:
  • 输入:nums = [2, 7, 11, 15], target = 9
  • 输出:[2, 7] 或者 [7, 2]

解法一(暴力解法)

算法思路

  • 两层 for 循环列出所有两个数字的组合,判断是否等于目标值。

算法流程

  • 两层 for 循环:
    • 外层 for 循环依次枚举第一个数 a
    • 内层 for 循环依次枚举第二个数 b,让它与 a 匹配;
    • 然后将挑选的两个数相加,判断是否符合目标值。

代码实现

class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {int n = nums.size();for (int i = 0; i < n; i++) {for (int j = i + 1; j < n; j++) {if (nums[i] + nums[j] == target)return {nums[i], nums[j]};}}return {-1, -1};}
};

解法二(双指针 - 对撞指针)

算法思路

  • 注意到本题是升序的数组,因此可以使用「对撞指针」优化时间复杂度。

算法流程

  • 初始化 leftright 分别指向数组的左右两端:
    • left < right 的时候,一直循环:
      • nums[left] + nums[right] == target 时,说明找到结果,记录结果,并返回;
      • nums[left] + nums[right] < target 时:
        • 说明当前和小于目标值,需要增大和,left++
      • nums[left] + nums[right] > target 时:
        • 说明当前和大于目标值,需要减小和,right--

代码实现

class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {int left = 0, right = nums.size() - 1;while (left < right) {int sum = nums[left] + nums[right];if (sum > target) right--;else if (sum < target) left++;else return {nums[left], nums[right]};}//这是为了照顾编译器,不然编译器报错:不是所有的路径都有返回值return {-1, -1};}
};

第三章:三数之和与四数之和

3.1 三数之和

题目链接:15. 三数之和
题目描述:给你一个整数数组 nums,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != ji != kj != k,同时还满足 nums[i] + nums[j] + nums[k] == 0。请你返回所有和为 0 且不重复的三元组。

注意:答案中不可以包含重复的三元组。

示例 1:
  • 输入:nums = [-1, 0, 1, 2, -1, -4]
  • 输出:[[-1, -1, 2], [-1, 0, 1]]
  • 解释:
    • nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0
    • nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0
    • nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0
    • 不同的三元组是 [-1, 0, 1][-1, -1, 2]
    • 注意,输出的顺序和三元组的顺序并不重要。
示例 2:
  • 输入:nums = [0, 1, 1]
  • 输出:[]
  • 解释:唯一可能的三元组和不为 0。
示例 3:
  • 输入:nums = [0, 0, 0]
  • 输出:[[0, 0, 0]]
  • 解释:唯一可能的三元组和为 0。
提示:
  • 3 <= nums.length <= 3000
  • -10^5 <= nums[i] <= 10^5

解法(排序+双指针)

算法思路

  • 本题与两数之和类似,是非常经典的面试题。
  • 与两数之和稍微不同的是,题目中要求找到所有「不重复」的三元组。我们可以利用双指针思想来对暴力枚举做优化:
    1. 先排序;
    2. 然后固定一个数 a
    3. 在这个数后面的区间内,使用「双指针算法」快速找到两个数之和等于 -a 即可。
  • 需要注意的是,这道题中需要有「去重」操作:
    1. 找到一个结果之后,leftright 指针要「跳过重复」的元素;
    2. 当使用完一次双指针算法之后,固定的 a 也要「跳过重复」的元素。

代码实现

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> ret;// 1. 排序sort(nums.begin(), nums.end());// 2. 利用双指针解决问题int n = nums.size();for (int i = 0; i < n; ) { // 固定数 aif (nums[i] > 0) break; // 小优化int left = i + 1, right = n - 1, target = -nums[i];while (left < right) {int sum = nums[left] + nums[right];if (sum > target) right--;else if (sum < target) left++;else {ret.push_back({nums[i], nums[left], nums[right]});left++, right--;// 去重操作 left 和 rightwhile (left < right && nums[left] == nums[left - 1]) left++;while (left < right && nums[right] == nums[right + 1]) right--;}}// 去重 ii++;while (i < n && nums[i] == nums[i - 1]) i++;}return ret;}
};

3.2 四数之和

题目链接:18. 四数之和
题目描述:给你一个由 n 个整数组成的数组 nums,和一个目标值 target。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]](若两个四元组元素一一对应,则认为两个四元组重复):

  • 0 <= a, b, c, d < n
  • abcd 互不相同
  • nums[a] + nums[b] + nums[c] + nums[d] == target

你可以按任意顺序返回答案。

示例 1:
  • 输入:nums = [1, 0, -1, 0, -2, 2], target = 0
  • 输出:[[-2, -1, 1, 2], [-2, 0, 0, 2], [-1, 0, 0, 1]]
示例 2:
  • 输入:nums = [2, 2, 2, 2, 2], target = 8
  • 输出:[[2, 2, 2, 2]]
提示:
  • 1 <= nums.length <= 200
  • -10^9 <= nums[i] <= 10^9
  • -10^9 <= target <= 10^9

解法(排序 + 双指针)

算法思路

  1. 依次固定一个数 a
  2. 在这个数 a 的后面区间上,利用「三数之和」找到三个数,使这三个数的和等于 target - a 即可。

代码实现

class Solution {
public:vector<vector<int>> fourSum(vector<int>& nums, int target) {vector<vector<int>> ret;// 1. 排序sort(nums.begin(), nums.end());// 2. 利用双指针解决问题int n = nums.size();for (int i = 0; i < n; ) { // 固定数 afor (int j = i + 1; j < n; ) { // 固定数 b// 双指针int left = j + 1, right = n - 1;long long aim = (long long)target - nums[i] - nums[j];while (left < right) {int sum = nums[left] + nums[right];if (sum < aim) left++;else if (sum > aim) right--;else {ret.push_back({nums[i], nums[j], nums[left++], nums[right--]});// 去重操作 left 和 rightwhile (left < right && nums[left] == nums[left - 1]) left++;while (left < right && nums[right] == nums[right + 1]) right--;}}// 去重 jj++;while (j < n && nums[j] == nums[j - 1]) j++;}// 去重 ii++;while (i < n && nums[i] == nums[i - 1]) i++;}return ret;}
};

写在最后

在本篇文章中,我们沿着双指针的足迹,走进了更为复杂的算法世界。从基础的排序与两数之和,到多元问题的优化解法,双指针以其灵活而高效的策略,为我们提供了简洁优雅的解题思路。无论是解锁数组中的隐藏结构,还是精确处理链表中的循环,双指针始终如同算法中的舞者,轻巧地穿梭于问题的复杂性之间,帮助我们化繁为简。

希望通过这些进阶题解,大家能不仅熟悉双指针的运用技巧,更能深刻体会到算法设计中的思维之美。未来的算法旅程中,无论面对怎样的挑战,双指针这一工具都能在你的编程工具箱中,成为应对复杂问题时得心应手的利器。

以上就是关于【优选算法篇】双指针的华丽探戈:深入C++算法殿堂的优雅追寻的内容啦,各位大佬有什么问题欢迎在评论区指正,或者私信我也是可以的啦,您的支持是我创作的最大动力!❤️

在这里插入图片描述

相关文章:

【优选算法篇】双指针的华丽探戈:深入C++算法殿堂的优雅追寻

文章目录 C 双指针详解&#xff1a;进阶题解与思维分析前言第一章&#xff1a;有效三角形的个数1.1 有效三角形的个数示例 1&#xff1a;示例 2&#xff1a;解法一&#xff08;暴力求解&#xff09;解法二&#xff08;排序 双指针&#xff09;易错点提示代码解读 第二章&#…...

【springboot入门-mvc常用注解使用方式及原理】

常用注解 PathVariable&#xff1a;用于从URL路径中提取变量。RequestHeader&#xff1a;用于从HTTP请求头中获取数据。ModelAttribute&#xff1a;用于获取请求参数&#xff08;包括URL参数和POST请求的表单数据&#xff09;&#xff0c;也可以用于将数据绑定到对象上。Reque…...

滚雪球学Redis[4.2讲]:Redis Sentinel 深度解析:工作原理、配置与高可用架构下的故障转移

全文目录&#xff1a; &#x1f389;前言&#x1f6a6;4.2 Redis Sentinel&#x1f504;Sentinel的工作原理Sentinel的选举机制 ⚙️Sentinel的配置与使用示例&#xff1a;配置Redis SentinelSentinel自动故障转移过程示例 &#x1f9e9;高可用架构下的故障转移常见问题与优化实…...

Vue3 -- 设置分页,切换分页之后选项仍能保留 控制多个表格的选中不会互相影响

在 Vue 3 中实现分页功能&#xff0c;并确保在切换分页时选中的选项能够保留&#xff0c;同时控制多个表格之间的选中状态不互相影响&#xff0c;可以按照以下步骤进行&#xff1a; 1. 数据结构设计 为每个表格维护独立的选中项和分页状态。可以使用一个对象来存储每个表格的…...

如何在 JSON 中编写“anyOf”语句?

在 JSON 中&#xff0c;anyOf 语句通常用于 JSON Schema&#xff08;JSON 模式&#xff09;中&#xff0c;来定义多个可能的模式&#xff0c;表示数据可以匹配多个子模式中的任意一个。这种功能常用于验证 JSON 数据是否符合某一组可能的条件之一。 1、问题背景 问题&#xff…...

python开发环境配置

下载python安装包安装python配置环境变量调整类库下载位置 安装python 安装python是指安装python的基础编译环境及python运行所需的必须资源&#xff0c;类似于安装java的JDK python2与python3差异 进行python安装前&#xff0c;需要先了解python2和python3的差异&#xff0…...

QT开发--QT SQL模块

第十五章 QT SQL模块 15.1 QT SQL模块概览 Qt SQL模块是Qt框架中操作数据库的组件&#xff0c;提供易用API&#xff0c;支持SQLite、MySQL等多种数据库。它包含数据库驱动与连接功能。 15.1.1 QSqlDatabase 类 在Qt SQL模块中&#xff0c;数据库驱动基于QSqlDriver类&#xf…...

如何保证接口幂等性?

一、什么是接口幂等性&#xff1f; 幂等性是指&#xff1a;同一请求&#xff0c;执行很多次&#xff0c;最终结果都一样。 二、为什么会产生接口幂等性问题&#xff1f; 那么&#xff0c;什么情况下&#xff0c;会产生接口幂等性的问题呢&#xff1f; 网络波动, 可能会引起重…...

【9718】基于springboot+vue的生鲜交易系统

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 项目描述 生鲜交易管理方面的任务繁琐,以至于交易市场每年都在生…...

Spring循环依赖解决方案

解决方案 使用提前暴露机制三级缓存进行解决 singletonObjects一级缓存&#xff0c;存放完整的 Bean。earlySingletonObjects二级缓存&#xff0c;存放提前暴露的Bean&#xff0c;Bean 是不完整的&#xff0c;未完成属性注入和执行 init 方法。singletonFactories三级缓存(用…...

解决 IntelliJ IDEA 运行时 “Command line is too long“ 问题

文章目录 文章标题&#xff1a;解决 IntelliJ IDEA 运行时 "Command line is too long" 问题简介问题描述解决方案代码示例代码示例1&#xff1a;使用JAR Manifest代码示例2&#xff1a;使用Classpath File代码示例3&#xff1a;优化项目依赖 结论进一步的资源 文章标…...

鸿蒙网络编程系列5-TCP连接超时分析

1. TCP连接超时简介 TCP是面向连接的协议&#xff0c;通过三次握手建立连接&#xff0c;但是&#xff0c;在建立连接的过程中对方有可能没有响应&#xff0c;这时候发起连接的一方会重试&#xff0c;如果重试多次仍然没有响应&#xff0c;就会触发超时&#xff0c;从而导致连接…...

金蝶云星空移动字段后关闭页面后重新打开无效

有同事反馈&#xff0c;单据的明细字段里面移动了字段&#xff0c;然后退出&#xff0c;其他字段都能按最后排版的位置显示&#xff0c;有个别字段始终无法按照排版的位置显示。 只需要打开BOS平台&#xff0c;找到对应字段&#xff0c;然后更改可见性。...

幂律分布笔记

一、幂律分布的数据拟合 数据分箱&#xff1a; 所谓分箱就是对原始数据进行分组&#xff0c;然后对每一组内的数据进行平滑处理。常见的分箱方式主要有等深分箱、等宽分箱、用户自定义等 对数分箱&#xff1a; 对原数据进行分箱&#xff0c;第i个箱的宽度为bi&#xff0c;b…...

一些NLP代表性模型

&#xff08;一&#xff09;BERT 由Bidirectional Encoder Representations from Transformers的首字母组成&#xff0c;是encoder-only结构类型的代表。 模型分预训练和微调两步&#xff0c;预训练任务有两类&#xff1a;masked language model(MLM)、next sentence predict…...

低代码移动端开发:未来的趋势与挑战

什么是低代码移动端开发&#xff1f; 低代码移动端开发平台允许开发者通过可视化界面和少量编码来构建应用程序。相较于传统的代码开发&#xff0c;低代码平台大大降低了技术和学习门槛&#xff0c;使非专业开发人员也能参与到移动应用的开发过程中。 低代码移动端开发的优势 …...

【Linux】嵌入式Linux系统的组成、u-boot编译

Linux—嵌入式Linux系统的组成、u-boot编译 前言一、嵌入式Linux系统的组成1.1 嵌入式Linux系统和PC完整的操作系统的对比如下&#xff1a;1.2 PC机—Windows系统启动流程&#xff08;PC机—Linux系统、嵌入式ARM—linux系统的启动流程类似&#xff09; 二、编译u-boot2.1 u-bo…...

Qt打开excel文件,并读取指定单元格数据

1. 下载并安装QXlsx库&#xff0c;详见之前的博文Qt子线程创建excel文件报错QObject: Cannot create children for a parent that is in a different thread.-CSDN博客 2. // 创建一个XlsxDocument对象QString filename "D:\\mydocuments\\data_acquisition\\data\\tes…...

适合下班回家做的小副业,用AI做视频,几天时间3000+

大家好&#xff0c;今天要给大家分享的项目是定制儿歌&#xff0c;精准定位宝妈群体&#xff0c;每天轻松赚500&#xff01; ***01* 项目原理 父母都非常疼爱自己的孩子&#xff0c;愿意为孩子提供独特的东西。而我们正是利用这一点&#xff0c;通过免费AI工具生成专属的儿童…...

git的基本操作 + 分支管理

一、基本操作 1. 修改文件 Git比其他的版本管理器设计得更加优秀&#xff0c;因为Git追踪并管理的是修改&#xff0c;而非文件。 修改一个文件&#xff0c;不管你是添加一行&#xff0c;或者删除一行&#xff0c;还是添加了又删除了&#xff0c;甚至你创建了一个新文件&…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

回溯算法学习

一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

嵌入式学习笔记DAY33(网络编程——TCP)

一、网络架构 C/S &#xff08;client/server 客户端/服务器&#xff09;&#xff1a;由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序&#xff0c;负责提供用户界面和交互逻辑 &#xff0c;接收用户输入&#xff0c;向服务器发送请求&#xff0c;并展示服务…...

R语言速释制剂QBD解决方案之三

本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...

解析两阶段提交与三阶段提交的核心差异及MySQL实现方案

引言 在分布式系统的事务处理中&#xff0c;如何保障跨节点数据操作的一致性始终是核心挑战。经典的两阶段提交协议&#xff08;2PC&#xff09;通过准备阶段与提交阶段的协调机制&#xff0c;以同步决策模式确保事务原子性。其改进版本三阶段提交协议&#xff08;3PC&#xf…...

【HarmonyOS 5】鸿蒙中Stage模型与FA模型详解

一、前言 在HarmonyOS 5的应用开发模型中&#xff0c;featureAbility是旧版FA模型&#xff08;Feature Ability&#xff09;的用法&#xff0c;Stage模型已采用全新的应用架构&#xff0c;推荐使用组件化的上下文获取方式&#xff0c;而非依赖featureAbility。 FA大概是API7之…...

rm视觉学习1-自瞄部分

首先先感谢中南大学的开源&#xff0c;提供了很全面的思路&#xff0c;减少了很多基础性的开发研究 我看的阅读的是中南大学FYT战队开源视觉代码 链接&#xff1a;https://github.com/CSU-FYT-Vision/FYT2024_vision.git 1.框架&#xff1a; 代码框架结构&#xff1a;readme有…...

Linux基础开发工具——vim工具

文章目录 vim工具什么是vimvim的多模式和使用vim的基础模式vim的三种基础模式三种模式的初步了解 常用模式的详细讲解插入模式命令模式模式转化光标的移动文本的编辑 底行模式替换模式视图模式总结 使用vim的小技巧vim的配置(了解) vim工具 本文章仍然是继续讲解Linux系统下的…...