leetcode-hot-100 (矩阵)

article/2025/8/10 4:38:09

1、矩阵置零

题目链接:矩阵置零
题目描述:给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。

解答

方法一:使用一个二维数组

这是我看到这道题目的第一个想法,就是直接循环遍历该数组的各个元素,然后要是遇到了数组元素为 0 0 0 的位置,直接在上小循环,对该位置所在的行和列进行置零,但是这样的话,元素主 m a t r i x matrix matrix 中的值被改变了,造成了数据污染,因此置零的依据不能是以原数组为依据,于是我又想到可以复制出来一个新的数组,然后以新的数组为置零依据,对原始数组 m a t r i x matrix matrix 进行操作即可,于是代码编写如下:

class Solution {
public:void setZeroes(vector<vector<int>>& matrix) {vector<vector<int>> temp(matrix);int row_len = matrix.size();int col_len = matrix[0].size();for (int i = 0; i < row_len; i++) {for (int j = 0; j < col_len; j++) {if (temp[i][j] == 0) {for (int k = 0; k < col_len; k++)matrix[i][k] = 0;for (int k = 0; k < row_len; k++)matrix[k][j] = 0;}}}}
};

结果也还不错(就是空间复杂度比较的高):在这里插入图片描述

方法二:使用两个一维数组

方法一的局限性在于其空间复杂度实在是太高了,也确实,因为我们在方法一中使用了一个二维数组,因此空间复杂度为 O ( m n ) O(mn) O(mn) ,但是经过仔细分析后我们可以发现,实际上创建一个二维数组是完全没有必要的,我们可以直接引入两个一维数组,一个行数组,一个列数组,分别记录要是某一行出现 0 0 0 ,这将行数组的对应位置置成 1 1 1 ,要是某一列出现 0 0 0 ,则将列数组的对应位置置成 1 1 1 ,即可,于是空间复杂度降到了 O ( m + n ) O(m+n) O(m+n)。(其中 m m m 是矩阵的行数, n n n 是矩阵的列数。)
经过上述的分析,代码编写如下:

class Solution {
public:void setZeroes(vector<vector<int>>& matrix) {int row_len = matrix.size();int col_len = matrix[0].size();vector<int> row(row_len, 0), col(col_len, 0);for (int i = 0; i < row_len; i++) {for (int j = 0; j < col_len; j++) {if (matrix[i][j] == 0) {row[i] = 1;col[j] = 1;}}}for (int i = 0; i < row_len; i++) {for (int j = 0; j < col_len; j++) {if (row[i] == 1 || col[j] == 1) {matrix[i][j] = 0;}}}}
};

方法三:使用两个标记变量

我们觉得方法二的空间复杂度还是太高了,能不能就是再次进行优化,实际上是可以的,方法二中使用了两个一维数组来分别记录各行各列零出现的情况,实际上我们可以使用 m a t r i x matrix matrix 数组的第一第一列充当方法二中的两个数组,但是这里有个问题:在更新第一行和第一列的时候,由于其被修改,无法记录其原来是否被包含 0 0 0,因此我们需要额外使用两个标记变量分别记录第一行和第一列是否原本包含 0 0 0。代码如下:

class Solution {
public:void setZeroes(vector<vector<int>>& matrix) {int rows = matrix.size();int cols = matrix[0].size();// 标记第一列是否包含0bool firstColHasZero = false;// 标记第一行是否包含0bool firstRowHasZero = false;// 检查第一列是否有0for (int i = 0; i < rows; ++i) {if (matrix[i][0] == 0) {firstColHasZero = true;break;}}// 检查第一行是否有0for (int j = 0; j < cols; ++j) {if (matrix[0][j] == 0) {firstRowHasZero = true;break;}}// 使用第一行和第一列作为标记数组for (int i = 1; i < rows; ++i) {for (int j = 1; j < cols; ++j) {if (matrix[i][j] == 0) {matrix[i][0] = 0;matrix[0][j] = 0;}}}// 根据第一行和第一列的标记,设置其余位置为0for (int i = 1; i < rows; ++i) {for (int j = 1; j < cols; ++j) {if (matrix[i][0] == 0 || matrix[0][j] == 0) {matrix[i][j] = 0;}}}// 处理第一列if (firstColHasZero) {for (int i = 0; i < rows; ++i) {matrix[i][0] = 0;}}// 处理第一行if (firstRowHasZero) {for (int j = 0; j < cols; ++j) {matrix[0][j] = 0;}}}
};

方法四:使用一个标记变量

可以对方法三进一步优化,只使用一个标记变量记录第一列是否原本存在 0 0 0。这样,第一列的第一个元素即可以标记第一行是否出现 0 0 0
注意:为了防止每一列的第一个元素被提前更新,需要从最后一行开始,倒序地处理矩阵元素。
官方的解法如下:

class Solution {
public: void setZeroes(vector<vector<int>>& matrix) {int m = matrix.size();int n = matrix[0].size();int flag_col0 = false;for (int i = 0; i < m; i++) {if (!matrix[i][0]) {flag_col0 = true;}for (int j = 1; j < n; j++) {if (!matrix[i][j]) {matrix[i][0] = matrix[0][j] = 0;}}}for (int i = m - 1; i >= 0; i--) {for (int j = 1; j < n; j++) {if (!matrix[i][0] || !matrix[0][j]) {matrix[i][j] = 0;}}if (flag_col0) {matrix[i][0] = 0;}}}
};作者:力扣官方题解
链接:https://leetcode.cn/problems/set-matrix-zeroes/solutions/669901/ju-zhen-zhi-ling-by-leetcode-solution-9ll7/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

2、螺旋矩阵

题目链接:螺旋矩阵
题目描述:给你一个 m m m n n n 列的矩阵 m a t r i x matrix matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

解答

法一

使用四个变量分别记录当前的上下左右边界:
upper(上边界)down(下边界)left(左边界)right(右边界)
按照顺时针方向依次遍历四条边:
从左到右 遍历上边界
从上到下 遍历右边界
从右到左 遍历下边界
从下到上 遍历左边界
每次遍历完一条边后,相应地收缩边界。
当任意一对对边交叉时(如 upper > down 或 left > right),说明所有元素已遍历完毕,退出循环。

class Solution {
public:vector<int> spiralOrder(vector<vector<int>>& matrix) {vector<int> ans; // 存储最终结果的数组// 如果矩阵为空,直接返回空结果if (matrix.empty())return ans;int upper = 0;                   // 上边界int down = matrix.size() - 1;    // 下边界int left = 0;                    // 左边界int right = matrix[0].size() - 1; // 右边界while (1) {// 1️⃣ 从左往右:遍历最上面一行for (int i = left; i <= right; ++i)ans.push_back(matrix[upper][i]);++upper; // 上边界下移if (upper > down) break; // 判断是否越界,即是否还有剩余行// 2️⃣ 从上往下:遍历最右边一列for (int i = upper; i <= down; ++i)ans.push_back(matrix[i][right]);--right; // 右边界左移if (right < left) break; // 判断是否越界// 3️⃣ 从右往左:遍历最下面一行for (int i = right; i >= left; --i)ans.push_back(matrix[down][i]);--down; // 下边界上移if (down < upper) break; // 判断是否越界// 4️⃣ 从下往上:遍历最左边一列for (int i = down; i >= upper; --i)ans.push_back(matrix[i][left]);++left; // 左边界右移if (left > right) break; // 判断是否越界}return ans;}
};

官方有些好的解法(用到了线代中矩阵旋转的相关数学知识),我附上链接。

官解

3、旋转图像

题目链接:旋转图像
题目描述:给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。

你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。

解答

不太会,直接看解答吧(主要还是空间想象力不足,数学基础不是很牢固)

方法一:使用辅助数组

显然,旋转了,肯定是有些数据会被污染,因此不考虑题目的要求,首先引入一个辅助数组进行题目的求解,可以考虑使用一个新的数组 new_matrix ,存储的是 matrix 数组经过旋转之后的结果,最后 new_matrix 数组赋值完成后,在赋值给 原数组 matrix 即可完成题目。

因此此处主要需要考虑的问题是,原数组经过旋转之后应该填写到新数组的哪个位置上去。
官方给出来结论如下:
在这里插入图片描述
于是我们根据这个方法可以写出如下的代码:

class Solution {
public:void rotate(vector<vector<int>>& matrix) {int len = matrix.size();auto new_matrix = matrix;for (int i = 0; i < len; i++) {for (int j = 0; j < len; j++) {new_matrix[j][len - i - 1] = matrix[i][j];}}matrix = new_matrix;}
};

方法二:原地旋转

听说有些公司要求使用方法二进行题目的求解,于是需要详细的理解这部分的代码和编码思想。
题目要求的是在不使用额外内存空间的情况下进行矩阵的原地旋转。
观察方法一,其中的主要公式如下:
m a t r i x [ c o l ] [ n − r o w − 1 ] = m a t r i x [ r o w ] [ c o l ] matrix[col][n - row - 1]=matrix[row][col] matrix[col][nrow1]=matrix[row][col]
这样的话,原来在 m a t r i x [ c o l ] [ n − r o w − 1 ] matrix[col][n - row - 1] matrix[col][nrow1] 的数据就会被覆盖,这就是在方法一中不得不使用额外的数组的原因。
实际上,可以引入一个辅助变量 t e m p temp temp 来帮助我们进行操作。于是有如下的公式:
{ temp = matrix[row][col] matrix[row][col] = matrix[n - col - 1][row] matrix[n - col - 1][row] = matrix[n - row - 1][n - col - 1] matrix[n - row - 1][n - col - 1] = matrix[col][n - row - 1] matrix[col][n - row - 1] = temp \begin{cases} \text{temp} & = \text{matrix[row][col]} \\ \text{matrix[row][col]} & = \text{matrix[n - col - 1][row]} \\ \text{matrix[n - col - 1][row]} & = \text{matrix[n - row - 1][n - col - 1]} \\ \text{matrix[n - row - 1][n - col - 1]} & = \text{matrix[col][n - row - 1]} \\ \text{matrix[col][n - row - 1]} & = \text{temp} \end{cases} tempmatrix[row][col]matrix[n - col - 1][row]matrix[n - row - 1][n - col - 1]matrix[col][n - row - 1]=matrix[row][col]=matrix[n - col - 1][row]=matrix[n - row - 1][n - col - 1]=matrix[col][n - row - 1]=temp

下面就需要确定需要枚举的元素的个数了,有如下的规则:
n n n 为偶数时,我们需要枚举 n 2 4 = ( n 2 ) × ( n 2 ) \frac{n^2}{4} = \left(\frac{n}{2}\right) \times \left(\frac{n}{2}\right) 4n2=(2n)×(2n) 个位置,可以将该图形分为四块。

n n n 为奇数时,由于中心的位置经过旋转后位置不变,我们需要枚举 n 2 − 1 4 = ( n − 1 2 ) × ( n + 1 2 ) \frac{n^2 - 1}{4} = \left(\frac{n - 1}{2}\right) \times \left(\frac{n + 1}{2}\right) 4n21=(2n1)×(2n+1) 个位置,需要换一种划分的方式。

理解了上述原理之后,编码就非常的简单了,直接把上述列举出来的五个公式编码出来即可,只需要注意一下行列的取值。

class Solution {
public:void rotate(vector<vector<int>>& matrix) {int len = matrix.size();int temp;for (int row = 0; row < len / 2; row++) {for (int col = 0; col < (len + 1) / 2; col++) {temp = matrix[row][col];matrix[row][col] = matrix[len - col - 1][row];matrix[len - col - 1][row] =matrix[len - row - 1][len - col - 1];matrix[len - row - 1][len - col - 1] =matrix[col][len - row - 1];matrix[col][len - row - 1] = temp;}}}
};

方法三:用翻转代替旋转

这部分主要还是需要有空间想象力,官方的文字解法比较的抽象,反正就是两点,首先将原矩阵通过水平轴翻转得到中间矩阵,再将中间矩阵沿着主对角线翻转得到答案。还是直接上代码比较的直观,解释还是比较的抽象了(当然,要是知道关键等式其实数学推导也不是很难)。
关键公式:
m a t r i x [ r o w ] [ c o l ] → 水平轴翻转 m a t r i x [ n − r o w − 1 ] [ c o l ] matrix[row][col] \xrightarrow{\text{水平轴翻转}} matrix[n - row - 1][col] matrix[row][col]水平轴翻转 matrix[nrow1][col]
m a t r i x [ n − r o w − 1 ] [ c o l ] → 主对角线翻转 m a t r i x [ c o l ] [ n − r o w − 1 ] matrix[n-row-1][col] \xrightarrow{\text{主对角线翻转}} matrix[col][n - row - 1] matrix[nrow1][col]主对角线翻转 matrix[col][nrow1]
在这里插入图片描述

class Solution {
public:void rotate(vector<vector<int>>& matrix) {int n = matrix.size();// 水平翻转for (int i = 0; i < n / 2; ++i) {for (int j = 0; j < n; ++j) {swap(matrix[i][j], matrix[n - i - 1][j]);}}// 主对角线翻转for (int i = 0; i < n; ++i) {for (int j = 0; j < i; ++j) {swap(matrix[i][j], matrix[j][i]);}}}
};

4、搜索二维矩阵 II

题目链接:搜索二维矩阵 II
题目描述:编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:
每行的元素从左到右升序排列。
每列的元素从上到下升序排列。

解答:

方法一:直接查找(暴力搜索)

实际上,暴力破解的复杂度也不是很高(时间复杂度为 O ( m n ) O(mn) O(mn) ),因此完全可以进行暴力破解。

class Solution {
public:bool searchMatrix(vector<vector<int>>& matrix, int target) {int m = matrix.size();int n = matrix[0].size();for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {if (matrix[i][j] == target)return true;}}return false;}
};

官方的解法写的优美一点:

class Solution {
public:bool searchMatrix(vector<vector<int>>& matrix, int target) {for (const auto& row: matrix) {for (int element: row) {if (element == target) {return true;}}}return false;}
};作者:力扣官方题解
链接:https://leetcode.cn/problems/search-a-2d-matrix-ii/solutions/1062538/sou-suo-er-wei-ju-zhen-ii-by-leetcode-so-9hcx/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

方法二:二分查找

由于矩阵 m a t r i x matrix matrix 中每一行的元素都是升序排列的,因此我们可以对每一行都使用一次二分查找,判断 t a r g e t target target 是否在该行中,从而判断 t a r g e t target target 是否出现。或者对每一列都使用一次二分查找,判断 t a r g e t target target 是否在该列中,从而判断 t a r g e t target target 是否出现。

对每一行都使用一次二分查找

class Solution {
public:bool searchMatrix(vector<vector<int>>& matrix, int target) {int m = matrix.size();int n = matrix[0].size();for (int i = 0; i < m; i++) {int upper = 0;int down = n - 1;while (upper <= down) {int temp = (upper + down) / 2;if (matrix[i][temp] > target)down = temp - 1;else if (matrix[i][temp] < target)upper = temp + 1;elsereturn true;}}return false;}
};

对每一列都使用一次二分查找

class Solution {
public:bool searchMatrix(vector<vector<int>>& matrix, int target) {int m = matrix.size();int n = matrix[0].size();for (int j = 0; j < n; j++) {int left = 0;int right = m - 1;while (left <= right) {int temp = (left + right) / 2;if (matrix[temp][j] > target)right = temp - 1;else if (matrix[temp][j] < target)left = temp + 1;elsereturn true;}}return false;}
};

上述实际上是手搓了一个二分查找,官方直接调用的 C++ 中相关 STL ,更加简洁与通俗易懂。

class Solution {
public:bool searchMatrix(vector<vector<int>>& matrix, int target) {for (const auto& row: matrix) {auto it = lower_bound(row.begin(), row.end(), target);if (it != row.end() && *it == target) {return true;}}return false;}
};作者:力扣官方题解
链接:https://leetcode.cn/problems/search-a-2d-matrix-ii/solutions/1062538/sou-suo-er-wei-ju-zhen-ii-by-leetcode-so-9hcx/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

方法三:Z 字形查找

其实我初步的想法就是找到矩阵中间位置(或靠近中间位置的地方,然后判断与 t a r g e t target target 的大小,然后进行类似于二分查找的过程,但是我这样发现实际上进行不下去,因为这样就相当于将原有的矩阵划分成了四个区域,左上角的一定小于该值,右下角的一定大于该值,但是剩下的左下角和右上角的区域就无法判断了,因此这种方法就实行不了了,因为不知道判断后究竟是向哪个反向移动。)

看了一下官方的题解,可以从右上角的位置出发,判断
发现这种方法确实可以,代码也通俗易懂,也知道每次判断后究竟是向哪个位置移动。

class Solution {
public:bool searchMatrix(vector<vector<int>>& matrix, int target) {int m = matrix.size();int n = matrix[0].size();int x = 0, y = n - 1;while (x < m && y >= 0) {if (matrix[x][y] == target) {return true;} else if (matrix[x][y] > target) {y--;} else {x++;}}return false;}
};

由于矩阵具有对称性,因此要是右上角可以的话,左下角也应该是可以的,于是写出类似的代码如下:

class Solution {
public:bool searchMatrix(vector<vector<int>>& matrix, int target) {int m = matrix.size();int n = matrix[0].size();int x = m - 1, y = 0;while (x >= 0 && y < n) {if (matrix[x][y] == target) {return true;} else if (matrix[x][y] > target) {x--;} else {y++;}}return false;}
};

http://www.hkcw.cn/article/WhgoMebmhs.shtml

相关文章

黑马Java面试笔记之Redis篇(分布式锁)

面试题 我看你做的项目中&#xff0c;都用到了redis&#xff0c;你在最近的项目中那些场景使用了redis呢 如果回答了分布式锁&#xff0c;那么就会有以下这个问题 redis分布式锁&#xff0c;是如何实现的&#xff1f; 需要结合项目中的业务进行回答&#xff0c;通常情况下&…

建筑兔零基础python自学记录102|Beautiful Soup库(1)-15

1、安装Beautiful Soup 2、使用测试网页获取源代码 This is a python demo page a)法1&#xff1a;直接网页右键获取 b)法2&#xff1a;request库 import requests rrequests.get(https://python123.io/ws/demo.html) print(r.text) 3、使用Beautiful Soup库 同样解析出了源…

【Java学习笔记】枚举

枚举(enum) 一、基本介绍 引出关键字&#xff1a;enum&#xff0c;全称为enumerate 枚举是一组常量集合 理解&#xff1a;枚举属于一种特殊的类&#xff0c;里面只包含一组有限的特定的对象 二、使用场景 当一个类的属性有限定条件时&#xff08;例如一个星期只能有七天&…

FFmpeg学习笔记

1. 播放器的架构 2. 播放器的渲染流程 3. ffmpeg下载与安装 3.0 查看PC是否已经安装了ffmpeg ffmpeg 3.1 下载 wget https://ffmpeg.org/releases/ffmpeg-7.0.tar.gz 3.2 解压 tar zxvf ffmpeg-7.0.tar.gz && cd ./ffmpeg-7.0 3.3 查看配置文件 ./configure …

buuctf-web

[极客大挑战 2019]Havefun 控制台检查代码修改url [极客大挑战 2019]EasySQL 密码输入 出现 sql输入错误 判断为 单引号注入 [ACTF2020 新生赛]Include 点击提示出现?file说明是文件包含问题 构造url filephp://filter/readconvert.base64-encode/resourceflag.php php:…

SAR ADC 异步逻辑设计

SAR ADC的逻辑是重要的一个模块&#xff0c;可以分为同步逻辑和异步逻辑&#xff0c;对于低速SAR ADC&#xff0c;一般采用同步逻辑&#xff0c;对于高速SAR ADC&#xff0c;一般采用异步逻辑。 这里讲一下异步逻辑的设计&#xff0c;异步逻辑一般不需要外部时钟&#xff08;当…

广告拦截器:全方位拦截,畅享无广告体验

在数字时代&#xff0c;广告无处不在。无论是浏览网页、使用社交媒体&#xff0c;还是观看视频&#xff0c;广告的频繁弹出常常打断我们的体验&#xff0c;让人不胜其烦。更令人担忧的是&#xff0c;一些广告可能包含恶意软件&#xff0c;威胁我们的设备安全和个人隐私。AdGuar…

MMRL: Multi-Modal Representation Learning for Vision-Language Models(多模态表示学习)

摘要 预训练的VLMs,对于跨任务的迁移学习至关重要&#xff0c;然而&#xff0c;在few-shot数据集上微调会导致过拟合&#xff0c;降低在新任务上的性能。为解决这个问题&#xff0c;提出一种新的多模态表征学习框架&#xff08;MMRL&#xff09;,该框架引入了一个共享、可学习…

【芯片学习】555

一、引脚作用 二、原理图 三、等效原理图 1.比较器 同相输入端大于反相输入端&#xff0c;输出高电平&#xff0c;反之亦然 2.三极管 给它输入高电平就可以导通 3.模拟电路部分 4.数字电路部分 这部分的核心是RS触发器&#xff0c;R-reset代表0&#xff0c;set是置位代表1&am…

从线性代数到线性回归——机器学习视角

真正不懂数学就能理解机器学习其实是个神话。我认为&#xff0c;AI 在商业世界可以不懂数学甚至不懂编程也能应用&#xff0c;但对于技术人员来说&#xff0c;一些基础数学是必须的。本文收集了我认为理解学习本质所必需的数学基础&#xff0c;至少在概念层面要掌握。毕竟&…

DAY 36 超大力王爱学Python

仔细回顾一下神经网络到目前的内容&#xff0c;没跟上进度的同学补一下进度。 作业&#xff1a;对之前的信贷项目&#xff0c;利用神经网络训练下&#xff0c;尝试用到目前的知识点让代码更加规范和美观。探索性作业&#xff08;随意完成&#xff09;&#xff1a;尝试进入nn.Mo…

【Oracle】数据备份与恢复

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. Oracle备份恢复概述1.1 为什么备份这么重要&#xff1f;1.2 Oracle备份策略全景图 2. 物理备份详解2.1 冷备份 - 最简单粗暴的方式2.1.1 冷备份的步骤2.1.2 冷备份恢复过程 2.2 热备份 - 不停机的备份艺术2.…

使用BERT/BiLSTM + CRF 模型进行NER进展记录~

使用代码处理数据集&#xff0c;发现了一些问题&#xff0c;以及解决办法~ 下载了一组数据集&#xff0c;数据存放在CSV中&#xff0c;GBK格式。如下&#xff1a; 首先对每一列直接进行NER抽取&#xff0c;结果非常不好&#xff1a; 几乎是乱抽取的&#xff0c;解决办法是自己创…

18. Qt系统相关:多线程

一、概述 在Qt中&#xff0c;使用QThread类对系统线程进行了封装。QThread代表一个在应用程序中可独立控制的线程&#xff0c;也可以和进程中的其他线程共享数据。 二、QThread常用API 三、QThread使用 自定义一个类&#xff0c;继承自QThread&#xff0c;并且只有一个线程处…

YOLOv7 辅助检测头与重参数化解析2025.6.1

YOLOv7 是目标检测领域的一个重要模型&#xff0c;其在速度和精度之间取得了较好的平衡。其中的**辅助检测头&#xff08;Auxiliary Head&#xff09;和重参数化&#xff08;Re-parameterization&#xff09;**是其核心创新点。以下是对这两个技术的详细解析&#xff1a; 一、辅…

CP4-OFDM模糊函数原理及仿真

文章目录 前言一、互补P4码序列二、barker-OFDM 信号1、OFDM 信号表达式2、模糊函数表达式 三、MATLAB 仿真1、MATLAB 核心源码2、仿真结果①、CP4-OFDM 模糊函数②、CP4-OFDM 距离分辨率③、CP4-OFDM 速度分辨率④、CP4-OFDM 等高线图 四、资源自取 前言 本文进行 CP4-OFDM 的…

【C语言预处理详解(上)】--预定义符号,#define定义常量,#define定义宏,带有副作用的宏参数,宏替换的规则,宏和函数的对比

目录 一.预定义符号 二.#define定义常量 三.#define定义宏 3.1--定义宏的方法和注意事项 3.2--带有副作用的宏参数 3.3--宏替换的规则 四.宏与函数的对比 &#x1f525;个人主页&#xff1a;草莓熊Lotso的个人主页 &#x1f3ac;作者简介&#xff1a;C研发方向学习者 &a…

CppCon 2014 学习:C++ Memory Model Meets High-Update-Rate Data Structures

这段内容是对一个主题的概览&#xff08;Overview&#xff09;&#xff0c;涉及并行更新的问题&#xff0c;特别是“Issaquah Challenge”这个具体案例。详细解读如下&#xff1a; Overview&#xff08;概览&#xff09; The Issaquah Challenge 这是一个特定的挑战或问题&am…

如何用利用deepseek的API能力来搭建属于自己的智能体-优雅草卓伊凡

如何用利用deepseek的API能力来搭建属于自己的智能体-优雅草卓伊凡 上一篇文章我们已经介绍了智能体和大模型AI的区别&#xff0c;现在我们开始搭建自己的智能体进行工作 1. 了解 DeepSeek 提供的 AI 能力 DeepSeek 提供强大的 大语言模型&#xff08;LLM&#xff09;&#x…

智能制造之精读——RPA制造行业常见场景【附全文阅读】

RPA 在制造行业应用广泛&#xff0c;为企业带来显著价值&#xff0c;是极具潜力的智能化解决方案。它能节省成本&#xff0c;降低人力与管理成本&#xff1b;提升运营效率&#xff0c;减少人机交互损耗&#xff1b;提高质量&#xff0c;保障流程准确性&#xff1b;还能增强合规…