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

leetcode-hot-100 (矩阵)

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;}
};

相关文章:

leetcode-hot-100 (矩阵)

1、矩阵置零 题目链接&#xff1a;矩阵置零 题目描述&#xff1a;给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 解答 方法一&#xff1a;使用一个二维数组 这是我看到这道题目的第一个想法&am…...

深度学习中常见的超参数对系统的影响

目录 一&#xff0c;学习率&#xff08;Learning Rate&#xff09; 1.1 学习率的本质&#xff1a;控制模型 “学习步伐” 的核心参数 1.2 学习率高低的具体影响&#xff1a;过犹不及的典型后果 1.3 学习率调整策略&#xff1a;3 个实用技巧 二&#xff0c;批次大小&#x…...

评标专家系统随机抽选 开发 Excel 中使用东方仙盟软件助理——未来之窗——仙盟创梦IDE

评标专家抽取系统是针对建设项目与采购招投标&#xff0c;从专家库中随机抽取参与评标专家&#xff0c;并自动进行语音通知的管理软件。符合《中华人民共和国招标投标法》及发改委颁布的《评标专家和评标专家库管理暂行办法》&#xff1b;操作简便、保密性强。 软件根据设定抽取…...

MySQL、PostgreSQL、Oracle 区别详解

MySQL、PostgreSQL、Oracle 区别详解 一、基础架构对比 1.1 数据库类型 MySQL:关系型数据库(支持NoSQL插件如MySQL Document Store)PostgreSQL:对象-关系型数据库(支持JSON等半结构化数据)Oracle:多模型数据库(关系型+文档+图+空间等)关键结论:PostgreSQL在数据类型…...

【第4章 图像与视频】4.6 结合剪辑区域来绘制图像

文章目录 前言示例 前言 本节将综合运用图像处理、离屏 canvas 以及剪辑区域等技术实现墨镜效果。 示例 主线程代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport&qu…...

【Linux】Linux文件系统详解

目录 Linux系统简介 Linux常见发行版&#xff1a; Linux/windows文件系统区别 Linux文件系统各个目录用途 Linux系统核心文件 系统核心配置文件 用户与环境配置文件 系统运行与日志文件 Linux文件名颜色含义 Linux文件关键信息解析 &#x1f525;个人主页 &#x1f52…...

IDEA使用Git进行commit提交到本地git空间后撤回到commit版本之前

一、前言 Git作为最流行和最全面的版本控制工具&#xff0c;非常好用&#xff0c;但是操作也会比SVN复杂一些。毕竟有得有失嘛&#xff0c;所以我选择Git&#xff0c;最近在工作中&#xff0c;一不小心吧一些无关紧要的文件commit了。还好在Push之前看到&#xff0c;不过就算P…...

LangChain完全指南:从入门到精通,打造AI应用开发新范式

目录 1. 引言2. LangChain 框架概述3. 架构设计与模块划分4. 核心原理深度解析5. 工作流程与执行过程6. 扩展与定制7. 性能优化策略8. 实际应用案例9. 常见问题与解决方案10. 未来发展与展望11. 总结12. 参考文献与资源 1. 引言 1.1 LangChain 简介 LangChain 是一个开源的…...

深入解析Vue.js:构建现代Web应用的高效之道

一、Vue.js 的核心设计理念 Vue.js 以渐进式框架为定位,强调轻量灵活与易上手性,允许开发者根据项目需求逐步引入核心功能或扩展模块。其核心设计遵循以下原则: 响应式数据绑定:通过数据劫持(Object.defineProperty/Proxy)和发布 - 订阅模式,实现视图与数据的自动同步,…...

VS Code / Cursor 将默认终端设置为 CMD 完整指南

文章目录 &#x1f9ed; 适用范围&#x1f4cc; 背景与问题分析&#x1f6e0; 配置步骤1. 打开设置&#xff08;settings.json&#xff09;2. 添加或更新配置3. 重启终端与编辑器 &#x1f4a1; 补充&#xff1a;支持多个终端配置&#x1f9ef; 常见问题排查✅ 总结 在 Windows…...

mybatis plus的源码无法在idea里 “download source“

下载不了源码 如下&#xff1a; Souces not found for com.baomidou:mybatis-plus-extension 解决方案 运行 mvn dependency:resolve -Dclassifiersources 不知道啥作用&#xff0c;总之对我管用&#xff0c;在项目根目录运行即可&#xff0c;即根pom.xml的位置。...

移动安全Android——客户端数据安全

本地文件权限配置 测试流程 &#xff08;1&#xff09;手机运行待测APP应用&#xff0c;adb执行命令找到APP包名 adb shell dumpsys activity top|findstr ACTIVITY &#xff08;2&#xff09;adb shell 进入设备&#xff0c;以Root权限进入/data/data/package包名目录下 c…...

Python包管理器 uv替代conda?

有人问&#xff1a;python的包管理器uv可以替代conda吗? 搞数据和算法的把conda当宝贝&#xff0c;其他的场景能替代。 Python的包管理器有很多&#xff0c;pip是原配&#xff0c;uv是后起之秀&#xff0c;conda则主打数据科学。 uv替代pip似乎只是时间问题了&#xff0c;它…...

数据库系统概论(十)SQL 嵌套查询 超详细讲解(附带例题表格对比带你一步步掌握)

数据库系统概论&#xff08;十&#xff09;SQL 嵌套查询 超详细讲解&#xff08;附带例题表格对比带你一步步掌握&#xff09; 前言一、什么是嵌套查询&#xff1f;1. 基础组成&#xff1a;查询块2. 嵌套的两种常见位置&#xff08;1&#xff09;藏在 FROM 子句里&#xff08;当…...

Git仓库大文件清理指南

前言 当大文件被提交到 Git 仓库后又删除&#xff0c;但仓库体积仍然很大时&#xff0c;这是因为 Git 保留了这些文件的历史记录。要彻底清理这些文件并减小仓库体积&#xff0c;你需要重写 Git 历史。 注意事项 这会重写历史 - 所有协作者都需要重新克隆仓库 备份你的仓库 …...

华为OD机试真题——最小矩阵宽度(宽度最小的子矩阵)(2025A卷:200分)Java/python/JavaScript/C/C++/GO最佳实现

2025 A卷 200分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…...

苹果公司计划按年份来重命名重大的软件,将升级iOS 18软件至iOS 26

苹果公司计划从今年开始&#xff0c;所有苹果操作系统将统一采用年份标识&#xff0c;而非此前混乱的版本号体系。苹果将在6月9日的全球开发者大会上正式宣布这一变革。周三截至发稿&#xff0c;苹果股价震荡微涨0.46%&#xff0c;重回3万亿美元市值。 苹果公司正在筹划其操作…...

园区智能化集成平台汇报方案

该方案为园区智能化集成平台设计,依据《智能建筑设计标准》等 20 余项国家与行业规范,针对传统园区信息孤岛、反应滞后、经验流失、管理粗放等痛点,构建可视化智慧园区管理平台,实现大屏数据可视化、三维设备监控、智慧运维(含工单管理、巡检打卡)、能源能耗分析、AI 安防…...

奥威BI+AI——高效智能数据分析工具,引领数据分析新时代

随着数据量的激增&#xff0c;企业对高效、智能的数据分析工具——奥威BIAI的需求日益迫切。奥威BIAI&#xff0c;作为一款颠覆性的数据分析工具&#xff0c;凭借其独特功能&#xff0c;正在引领数据分析领域的新纪元。 一、‌零报表环境下的极致体验‌ 奥威BIAI突破传统报表限…...

Spark on Hive表结构变更

Spark on Hive表结构变更 1、表结构变更概述1、表结构变更概述 在Spark on Hive架构中,表结构(Schema)变更是一个常见且重要的操作。理解其背景、使用场景以及具体方式对于大数据平台管理至关重要 1.1、Spark on Hive元数据管理 Hive Metastore(HMS): 核心组件。它是一个…...

python做题日记(11)

第二十五题 第二十五题是k个一组翻转链表&#xff0c;意思是给定一个链表&#xff0c;将每k个结点化成一组&#xff0c;对它们进行翻转操作&#xff0c;在对每一组都进行翻转操作之后&#xff0c;将它们重新连接起来&#xff0c;返回这个新的链表。所以代码思路也很好想&#x…...

2025——》NumPy中的np.logspace使用/在什么场景下适合使用np.logspace?NumPy中的np.logspace用法详解

1.NumPy中的np.logspace使用: 在 NumPy 中,np.logspace函数用于生成对数尺度上等间距分布的数值序列,适用于科学计算、数据可视化等需要对数间隔数据的场景。以下是其核心用法和关键细节: 一、基础语法与参数解析: numpy.logspace(start, stop, num=50, endpoint=True, ba…...

STM32F407VET6学习笔记8:UART5串口接收中断的Cubemx配置

之前的工程对串口的配置没有完善串口接受中断&#xff0c;这里补充配置UART5串口接收中断&#xff0c;实现串口回送功能 之前的文章&#xff1a; STM32F407VET6学习笔记5&#xff1a;STM32CubeMX配置串口工程_HAL库-CSDN博客 目录 中断配置&#xff1a; 中断服务函数&#xff1…...

UE5.5 pixelstreaming插件打包报错

文章目录 错误内容如下解决方案推流服务器不能使用 错误内容如下 The following files are set to be staged, but contain restricted folder names ("Linux"): CTZ5_5/Samples/PixelStreaming/WebServers/Extras/FrontendTests/dockerfiles/linux/Dockerfile CTZ5…...

Python Django完整教程与代码示例

边写代码零食不停口 盼盼麦香鸡味块 、卡乐比&#xff08;Calbee&#xff09;薯条三兄弟 独立小包、好时kisses多口味巧克力糖、老金磨方【黑金系列】黑芝麻丸 边写代码边贴面膜 事业美丽两不误 DR. YS 野森博士【AOUFSE/澳芙雪特证】377专研美白淡斑面膜组合 优惠劵 别光顾写…...

Spring Boot,两种配置文件

Spring Boot 主要支持两种配置文件格式&#xff0c;它们允许你外部化应用程序的配置&#xff1a;.properties 文件和 .yml (或 .yaml) 文件。以下是关于这两种配置文件的关键知识点&#xff1a; 1. application.properties 文件 格式: 基于键值对的纯文本文件。 语法: keyvalu…...

OpenLayers 地图标注之图文标注

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图标注是将空间位置信息点与地图关联、通过图标、窗口等形式把相关信息展现到地图上。在WebGIS中地图标注是重要的功能之一&#xff0c;可以为用户提供…...

设计模式——简单工厂模式(创建型)

摘要 本文主要介绍了简单工厂模式&#xff0c;包括其定义、结构、实现方式、适用场景、实战示例以及思考。简单工厂模式是一种创建型设计模式&#xff0c;通过工厂类根据参数决定创建哪一种产品类的实例&#xff0c;封装了对象创建的细节&#xff0c;使客户端无需关心具体类的…...

qt ubuntu 20.04 交叉编译

一、交叉编译环境搭建 1.下载交叉编译工具链&#xff1a;https://developer.arm.com/downloads/-/gnu-a 可以根据自己需要下载对应版本&#xff0c;当前最新版本是10.3, 笔者使用10.3编译后的glibc.so版本太高&#xff08;glibc_2.3.3, glibc_2.3.4, glibc_2.3.5&#xff09;…...

java中cocurrent包常用的集合类操作

文章目录 前置ConcurrentHashMapCopyOnWriteArrayList/CopyOnWriteArraySet 前置 常规的集合类&#xff0c;比如 ArrayList&#xff0c;HashMap 当作为多线程下共享的变量时候&#xff0c;操作它们时会涉及线程安全的问题 ConcurrentHashMap 适合&#xff1a;需要频繁读写的…...