实用指南:数组矩阵理论基础

news/2026/1/21 11:58:28/文章来源:https://www.cnblogs.com/tlnshuju/p/19510863

实用指南:数组&&矩阵理论基础

2026-01-21 11:45  tlnshuju  阅读(0)  评论(0)    收藏  举报

文章目录

  • 普通数组理论基础
    • 1. 数组的基本概念
      • 1.1 基本术语
      • 1.2 数组的特点
    • 2. 数组的基本操作
      • 2.1 数组的遍历
      • 2.2 数组的修改
    • 3. 前缀和(Prefix Sum)
      • 3.1 前缀和的基本概念
      • 3.2 前缀和的构造
      • 3.3 区间和查询
    • 4. 矩阵(二维数组)操作
      • 4.1 矩阵的基本概念
      • 4.2 矩阵的遍历
      • 4.3 螺旋矩阵
        • 模板1:螺旋矩阵(遍历)
        • 模板2:螺旋矩阵II(生成)
      • 4.4 矩阵的统计操作
    • 5. 数组操作的时间复杂度
    • 6. 何时使用数组技巧
      • 6.1 使用场景
      • 6.2 判断标准
    • 7. 数组操作的优缺点
      • 7.1 优点
      • 7.2 缺点
    • 8. 常见题型总结
      • 8.1 前缀和类
      • 8.2 矩阵类
      • 8.3 数组基本操作类
    • 9. 总结

普通数组理论基础

1. 数组的基本概念

**数组(Array)**是一种线性数据结构,由相同类型的元素按一定顺序排列而成,通过索引访问元素。

1.1 基本术语

  • 索引(Index):数组中元素的位置,通常从0开始
  • 元素(Element):数组中存储的数据
  • 长度(Length):数组中元素的数量
  • 一维数组:线性排列的数组
  • 二维数组(矩阵):按行和列排列的数组

1.2 数组的特点

示例

一维数组:[1, 2, 3, 4, 5]
索引:     0  1  2  3  4
二维数组(矩阵):
[1, 2, 3]
[4, 5, 6]
[7, 8, 9]
行索引:0, 1, 2
列索引:0, 1, 2

2. 数组的基本操作

2.1 数组的遍历

一维数组遍历

// 方式1:索引遍历
for(int i = 0; i < nums.size(); i++) {
// 访问 nums[i]
}
// 方式2:范围遍历
for(int num : nums) {
// 访问 num
}

二维数组遍历

// 遍历二维数组
for(int i = 0; i < matrix.size(); i++) {
for(int j = 0; j < matrix[i].size(); j++) {
// 访问 matrix[i][j]
}
}

2.2 数组的修改

重要特性

  • 数组元素不能直接删除,只能覆盖
  • 删除操作需要将后续元素前移

示例

// 删除索引为index的元素
void removeElement(int arr[], int &size, int index) {
if(index < 0 || index >= size) {return;  // 索引无效}// 将后续元素前移for(int i = index; i < size - 1; i++) {arr[i] = arr[i + 1];}size--;  // 减少数组大小}

3. 前缀和(Prefix Sum)

3.1 前缀和的基本概念

前缀和是数组中前i个元素的和,用于快速计算区间和。

定义

示例

原数组:[1, 2, 3, 4, 5]
前缀和:[1, 3, 6, 10, 15]
计算区间[1, 3]的和:
prefix[3] - prefix[0] = 10 - 1 = 9
验证:2 + 3 + 4 = 9 ✓

3.2 前缀和的构造

核心思路

  • 遍历数组,累加元素
  • 将累加结果存入前缀和数组

模板代码

// 构造前缀和数组
vector<int> prefix(n);int presum = 0;for(int i = 0; i < n; i++) {presum += arr[i];prefix[i] = presum;}

3.3 区间和查询

适用场景:多次查询数组的区间和

核心思路

  • 使用前缀和数组快速计算区间和
  • 时间复杂度:O(1)(查询),O(n)(预处理)

模板代码

// LeetCode 58. 区间和
#include <iostream>#include <vector>using namespace std;int main() {int n, a, b;cin >> n;vector<int> vec(n);      // 输入数组vector<int> p(n);        // 前缀和数组int presum = 0;// 构造前缀和数组for(int i = 0; i < n; i++) {scanf("%d", &vec[i]);presum += vec[i];p[i] = presum;}// 查询区间和while(~scanf("%d%d", &a, &b)) {int sum;if(a == 0) {sum = p[b];  // 区间[0, b]的和} else {sum = p[b] - p[a - 1];  // 区间[a, b]的和}printf("%d\n", sum);}return 0;}

关键点

  • 前缀和数组:p[i]表示前i+1个元素的和
  • 区间和计算:[a, b]的和 = p[b] - p[a-1]
  • 边界处理:当a=0时,直接使用p[b]
  • 时间复杂度:预处理O(n),查询O(1)

4. 矩阵(二维数组)操作

4.1 矩阵的基本概念

**矩阵(Matrix)**是二维数组,由行和列组成。

基本操作

4.2 矩阵的遍历

按行遍历

for(int i = 0; i < matrix.size(); i++) {
for(int j = 0; j < matrix[i].size(); j++) {
// 访问 matrix[i][j]
}
}

按列遍历

for(int j = 0; j < matrix[0].size(); j++) {
for(int i = 0; i < matrix.size(); i++) {
// 访问 matrix[i][j]
}
}

4.3 螺旋矩阵

适用场景:按螺旋顺序遍历或生成矩阵

核心思路

  • 使用循环不变量:每次操作的方法一致(左闭右开)
  • 按圈遍历:从外圈到内圈
  • 处理边界:单行或单列的特殊情况
模板1:螺旋矩阵(遍历)

适用场景:按螺旋顺序遍历矩阵并输出元素

模板代码

// LeetCode 54. 螺旋矩阵
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {vector<int> ans;int m = matrix.size();int n = matrix[0].size();int startx = 0, starty = 0;  // 起始位置int offset = 1;              // 每圈的偏移量int loop = min(m, n) / 2;    // 循环圈数// 处理单行或单列if(m == 1) {return matrix[0];}if(n == 1) {for(int k = 0; k < m; k++) {ans.push_back(matrix[k][0]);}return ans;}// 按圈遍历(左闭右开)while(loop--) {int i = startx, j = starty;// 第一行:从左到右for(; j < n - offset; j++) {ans.push_back(matrix[i][j]);}// 最后一列:从上到下for(; i < m - offset; i++) {ans.push_back(matrix[i][j]);}// 最后一行:从右到左for(; j > starty; j--) {ans.push_back(matrix[i][j]);}// 第一列:从下到上for(; i > startx; i--) {ans.push_back(matrix[i][j]);}startx++;starty++;offset++;}// 处理剩余的单行或单列if(min(m, n) % 2 == 1) {if(m <= n) {// 剩余单行for(int jj = starty; jj < n - offset + 1; jj++) {ans.push_back(matrix[startx][jj]);}} else {// 剩余单列for(int ii = startx; ii < m - offset + 1; ii++) {ans.push_back(matrix[ii][starty]);}}}return ans;}};

关键点

  • 循环不变量:左闭右开
  • 四个方向:右→下→左→上
  • 边界处理:单行或单列的特殊情况
  • 时间复杂度:O(m × n),空间复杂度:O(1)
模板2:螺旋矩阵II(生成)

适用场景:生成一个n×n的螺旋矩阵

模板代码

// LeetCode 59. 螺旋矩阵II
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {vector<vector<int>> vec(n, vector<int>(n));int startx = 0, starty = 0;  // 起始位置int offset = 1;               // 每圈的偏移量int count = 1;                // 填充的数字int cir = n / 2;              // 循环圈数int mid = n / 2;              // 中间位置// 按圈填充(左闭右开)while(cir--) {int i = startx, j = starty;// 第一行:从左到右for(; j < n - offset; j++) {vec[i][j] = count++;}// 最后一列:从上到下for(; i < n - offset; i++) {vec[i][j] = count++;}// 最后一行:从右到左for(; j > startx; j--) {vec[i][j] = count++;}// 第一列:从下到上for(; i > starty; i--) {vec[i][j] = count++;}startx++;starty++;offset++;}// 处理中间元素(n为奇数时)if(n % 2) {vec[mid][mid] = count;}return vec;}};

关键点

  • 循环不变量:左闭右开
  • 四个方向填充:右→下→左→上
  • 中间元素:n为奇数时需要单独处理
  • 时间复杂度:O(n²),空间复杂度:O(n²)

4.4 矩阵的统计操作

适用场景:统计矩阵的行和、列和等

模板代码

// 统计矩阵的行和与列和
vector<int> horizontal(n, 0);  // 每行的和vector<int> vertical(m, 0);    // 每列的和// 统计行和for(int i = 0; i < n; i++) {for(int j = 0; j < m; j++) {horizontal[i] += matrix[i][j];}}// 统计列和for(int j = 0; j < m; j++) {for(int i = 0; i < n; i++) {vertical[j] += matrix[i][j];}}

5. 数组操作的时间复杂度

操作时间复杂度空间复杂度说明
访问元素O(1)O(1)通过索引直接访问
遍历数组O(n)O(1)需要访问所有元素
查找元素O(n)O(1)线性查找
插入元素O(n)O(1)需要移动后续元素
删除元素O(n)O(1)需要移动后续元素
前缀和构造O(n)O(n)需要额外空间存储前缀和
区间和查询O(1)O(1)使用前缀和数组
矩阵遍历O(m × n)O(1)m为行数,n为列数
螺旋矩阵O(m × n)O(1)需要遍历所有元素

注意

  • 数组的随机访问是O(1)
  • 插入和删除操作需要移动元素,时间复杂度为O(n)
  • 前缀和可以优化区间和查询到O(1)

6. 何时使用数组技巧

6.1 使用场景

  1. 区间和问题

    • 多次查询数组的区间和
    • 使用前缀和优化查询效率
  2. 矩阵遍历问题

    • 螺旋矩阵遍历
    • 矩阵的按行、按列遍历
    • 矩阵的统计操作
  3. 数组基本操作

    • 数组的遍历
    • 数组元素的修改
    • 数组的查找
  4. 二维数组问题

    • 矩阵的生成
    • 矩阵的旋转、转置
    • 矩阵的统计和计算

6.2 判断标准

当遇到以下情况时,考虑使用数组技巧

示例

// 问题:多次查询数组的区间和
// 暴力解法:每次查询O(n)
for(int i = a; i <= b; i++) {
sum += arr[i];
}
// 前缀和解法:预处理O(n),查询O(1)
vector<int> prefix(n);// 构造前缀和数组for(int i = 0; i < n; i++) {prefix[i] = (i == 0 ? arr[i] : prefix[i-1] + arr[i]);}// 查询区间和int sum = prefix[b] - (a > 0 ? prefix[a-1] : 0);

7. 数组操作的优缺点

7.1 优点

7.2 缺点

  • 固定大小:数组大小在创建时确定(C++中vector是动态数组)
  • 插入删除慢:插入和删除操作需要移动元素,时间复杂度为O(n)
  • 空间限制:需要连续的内存空间
  • 无法直接删除:数组元素不能直接删除,只能覆盖

8. 常见题型总结

8.1 前缀和类

  1. 区间和查询

    • 使用前缀和数组快速计算区间和
    • 时间复杂度:预处理O(n),查询O(1)
  2. 子数组和问题

    • 结合前缀和和哈希表
    • 可以解决子数组和等于k的问题

8.2 矩阵类

  1. 螺旋矩阵

  2. 矩阵统计

  3. 矩阵遍历

8.3 数组基本操作类

  1. 数组遍历

    • 一维数组遍历
    • 二维数组遍历
  2. 数组修改

    • 元素的覆盖
    • 元素的移动

9. 总结

普通数组是基础的数据结构,掌握数组的基本操作和常用技巧对于解决算法问题至关重要。

核心要点

  1. 数组特性:连续内存、随机访问、元素覆盖
  2. 前缀和:用于优化区间和查询,预处理O(n),查询O(1)
  3. 矩阵操作:螺旋矩阵、矩阵统计、矩阵遍历
  4. 时间复杂度:访问O(1),遍历O(n),插入删除O(n)
  5. 空间复杂度:通常为O(1)或O(n)

使用建议

常见题型总结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1194340.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

紧急避坑指南:Python中生成真随机数的3种安全方式,第2种最推荐

第一章&#xff1a;Python中随机数生成的基本概念在编程中&#xff0c;随机数被广泛应用于模拟、游戏开发、密码学和机器学习等领域。Python 提供了内置的 random 模块&#xff0c;用于生成伪随机数。这些数字并非真正意义上的“随机”&#xff0c;而是通过确定性算法生成的序列…

Spring Boot 3 + MyBatis-Plus实战教程(新手必看配置避坑手册)

第一章&#xff1a;Spring Boot 3 MyBatis-Plus 整合概述Spring Boot 3 是 Spring 生态面向 Jakarta EE 9 的首个主版本&#xff0c;全面基于 Java 17、移除了对 Java 8 和 Java 15 的兼容支持&#xff0c;并默认启用 Jakarta EE 命名空间&#xff08;如 jakarta.persistence …

2026最新青少年/儿童近视防控配镜推荐!重庆专业配镜机构权威榜单发布,科学防控与舒适体验双优助力孩子清晰视界

引言 随着数字化生活方式普及,我国近视人群比例已达53.6%,眼镜消费市场呈现"专业性"与"性价比"双重需求升级趋势。据中国眼镜协会2025年度行业报告显示,消费者对验光精准度、镜片品质及售后保障…

sql多表连接

1、内连接 (1)普通内连接 格式: select * from 表1 INNER JOIN 表2 on 表1.关联字段1=表2.关联字段2 如: select * from dept INNER JOIN emp on dept.dept1=emp.dept2 (2)隐藏连接 格式:select …

大模型输出长度控制测试指南:平衡信息完整性与系统效能的实践探索

输出长度不是“小细节”&#xff0c;而是测试失效的隐形炸弹在大模型&#xff08;LLM&#xff09;测试实践中&#xff0c;测试人员常将注意力集中在回答准确性、逻辑一致性、事实正确性等显性指标上&#xff0c;却普遍忽视一个高频但隐蔽的失效模式&#xff1a;‌输出长度控制失…

【技术教程】Excel VBA 双击标题列修改标签功能

Excel VBA 双击标题列修改标签功能 以下是完整整理后的方案&#xff0c;逻辑清晰、结构分明。 完整代码 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) 可配置参数 Const TITLE_COLUMN As Integer 2 标题列&#xff08;双击…

你不知道的Python模块搜索路径秘密,精准破解ModuleNotFoundError

第一章&#xff1a;Python模块搜索路径的本质与常见误区Python在导入模块时&#xff0c;会按照特定顺序搜索一系列目录&#xff0c;这一机制由sys.path控制。理解其工作原理对避免导入错误至关重要。模块搜索路径的构成 当执行import numpy时&#xff0c;Python解释器按sys.pat…

还在写重复代码?用带参数的Python装饰器提升开发效率80%!

第一章&#xff1a;Python装饰器带参数的核心概念Python 装饰器是用于修改函数或类行为的强大工具&#xff0c;而带参数的装饰器则进一步增强了其灵活性。与普通装饰器不同&#xff0c;带参数的装饰器实际上是一个返回装饰器的函数&#xff0c;它允许在应用时传入配置信息&…

Seurat模块分层理解学习

Seurat对象:存储数据,将原始数据、分析过程、中间结果和最终结论有机地整合在一起,确保了分析流程的标准化、可追溯和可重复。 其核心结构是一个名为 AnnotatedChip​ 的S4类对象,它包含多个称为 域(slots)​ 的…

升降横移式立体车库设计机械设计

目录升降横移式立体车库的机械设计概述钢结构框架设计载车板与传动系统安全装置设计控制系统设计设计计算示例&#xff08;关键公式&#xff09;优化方向源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;升降横移式立体车库的机械设计概述…

【Spring Boot 3整合MyBatis-Plus终极指南】:从零搭建高效持久层架构

第一章&#xff1a;Spring Boot 3与MyBatis-Plus整合概述 在现代Java企业级开发中&#xff0c;Spring Boot凭借其约定优于配置的特性极大提升了开发效率&#xff0c;而MyBatis-Plus作为MyBatis的增强工具&#xff0c;进一步简化了持久层开发。将Spring Boot 3与MyBatis-Plus整合…

2026语音机器人品牌选型避坑指南:猎户星空等8家厂商真实能力测评

随着人工智能技术的快速发展,语音机器人已从概念演示阶段进入规模化应用的临界点。2026年,企业在选择语音机器人品牌时,不仅要关注技术参数,更需要综合评估场景适配性、成本效益和长期服务能力。本文基于真实市场数…

如何测试AI生成的代码是否易读?我设计了“可读性评分”

AI生成代码的可读性挑战在软件测试领域&#xff0c;AI生成代码&#xff08;如由GitHub Copilot或ChatGPT生成的代码&#xff09;正迅速普及。然而&#xff0c;这些代码往往缺乏人类工程师的“可读性基因”——变量命名混乱、结构冗长、注释缺失等问题频发。作为测试从业者&…

2026最新眼镜店推荐!重庆高品质眼镜店权威榜单发布,专业验配服务助力清晰视觉体验——尼康/蔡司/依视路镜片适配眼镜店推荐

引言 随着数字化生活方式普及,我国近视人群比例已达53.6%,眼镜消费市场呈现"专业性"与"性价比"双重需求升级趋势。据中国眼镜协会2025年度行业报告显示,消费者对验光精准度、镜片品质及售后保障…

【资深DBA亲授】:Python连接PostgreSQL的7大核心要点与安全实践

第一章&#xff1a;Python连接PostgreSQL概述在现代Web开发和数据处理场景中&#xff0c;Python因其简洁的语法和强大的生态被广泛用于与数据库交互。PostgreSQL作为功能丰富的开源关系型数据库&#xff0c;支持复杂查询、事务、JSON字段等高级特性&#xff0c;成为许多项目的首…

Python开发者必知的5个gc模块技巧(提升程序性能90%)

第一章&#xff1a;Python垃圾回收机制概述 Python 的内存管理由解释器自动处理&#xff0c;其核心机制之一是垃圾回收&#xff08;Garbage Collection, GC&#xff09;。Python 主要通过引用计数、标记-清除和分代回收三种策略协同工作&#xff0c;以高效地管理内存资源并避免…

PyTorch GPU版本安装失败?揭秘99%开发者忽略的3大核心坑点

第一章&#xff1a;PyTorch GPU版本安装失败&#xff1f;揭秘99%开发者忽略的3大核心坑点 在深度学习开发中&#xff0c;PyTorch 的 GPU 支持是提升训练效率的关键。然而&#xff0c;许多开发者在安装 PyTorch GPU 版本时频繁遭遇失败&#xff0c;问题往往源于对底层依赖关系的…

智慧鱼缸控制器设计

目录智慧鱼缸控制器设计概述核心功能模块硬件设计要点软件设计示例&#xff08;伪代码&#xff09;关键技术挑战扩展功能方向源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;智慧鱼缸控制器设计概述 智慧鱼缸控制器是一种通过物联网技术…

2025成都火锅回头客排行揭晓,网红店霸榜实至名归!,美食/烧菜火锅/社区火锅/火锅店/特色美食,成都火锅品牌排行榜

近年来,成都火锅市场持续升温,网红品牌与老字号并存,竞争愈发激烈。在消费者对口味、体验、性价比的综合考量下,一批以“回头客”为核心竞争力的火锅品牌脱颖而出。它们凭借独特的产品定位、稳定的品质输出与情感共…

云南城市建设职业学院校园网络安全规划与设计

目录云南城市建设职业学院校园网络安全规划与设计核心目标技术架构设计管理措施典型案例参考源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;云南城市建设职业学院校园网络安全规划与设计 云南城市建设职业学院作为一所高职院校&#x…