(60)矩阵中的局部最大值

文章目录

  • [1. 每日一言](#1. 每日一言)
  • [2. 题目](#2. 题目)
  • [3. 解题思路](#3. 解题思路)
  • [4. 代码](#4. 代码)
  • [5. 结语](#5. 结语)

1. 每日一言

烛分歌扇泪,雨送酒船香。
出自 唐⋅ 李商隐 的《夜饮》


2. 题目

题目链接:矩阵中的局部最大值

给你一个大小为 n x n 的整数矩阵 grid 。

生成一个大小为 (n - 2) x (n - 2) 的整数矩阵 maxLocal ,并满足:

maxLocalij 等于 grid 中以 i + 1 行和 j + 1 列为中心的 3 x 3 矩阵中的 最大值 。

换句话说,我们希望找出 grid 中每个 3 x 3 矩阵中的最大值。

返回生成的矩阵。

  • 示例 1:

    输入:grid = \[9,9,8,1,5,6,2,6,8,2,6,4,6,2,2,2]

    输出:\[9,9,8,6]

    解释:原矩阵和生成的矩阵如上图所示。

    注意,生成的矩阵中,每个值都对应 grid 中一个相接的 3 x 3 矩阵的最大值。

  • 示例 2:

    输入:grid = \[1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1]

    输出:\[2,2,2,2,2,2,2,2,2]

    解释:注意,2 包含在 grid 中每个 3 x 3 的矩阵中。

提示:

n == grid.length == gridi.length

3 <= n <= 100

1 <= gridij <= 100


3. 解题思路

  1. 首先,使用 malloc 函数为存储结果的二维数组 arr 分配空间,它的大小为 (gridSize-2),即去除了边缘的两行和两列。
  2. 接着,使用 calloc 函数为 arr 中的每一行分配空间,并将每个元素初始化为 0。
  3. 使用双重循环遍历 grid 中的每个位置,变量 i 和 j 分别表示行索引和列索引。
  4. 对于每个位置 (i, j),再使用内嵌的两个循环遍历当前子网格中的每个元素。
  5. 在内部循环中,使用变量 a 和 b 遍历子网格(3*3)中每个位置。通过比较当前位置的值 gridab 和 arrij,来更新 arr 中存储的最大值。
  6. 完成对 grid 中每个子网格的遍历后,设置 *returnSize 的值为 gridSize-2,即结果数组 arr 的大小。
  7. 使用 calloc 为 *returnColumnSizes 分配内存空间,并为每个元素赋值为 gridSize-2,表示每一行的列数。
  8. 最后,返回存储最大值数组的二维指针 arr。

4. 代码

c 复制代码
/**
 * Return an array of arrays of size *returnSize.
 * The sizes of the arrays are returned as *returnColumnSizes array.
 * Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
 */
int** largestLocal(int** grid, int gridSize, int* gridColSize, int* returnSize, int** returnColumnSizes) {
    //创建二维数组
    int **arr = malloc(sizeof(int*)*(gridSize-2));
    //给二维数组的每一行申请空间
    for(int i = 0; i < gridSize-2; i++) {
        arr[i] = calloc(gridSize-2,sizeof(int));
    }

    for(int i = 0; i < gridSize - 2; i++) {
        for(int j = 0; j < gridSize - 2; j++) {
            int a = 0;
            int b = 0;
            for( a = i; a <= i + 2; a++) {
                for( b = j; b <= j + 2; b++) {
                    arr[i][j] = arr[i][j]<grid[a][b]?grid[a][b]:arr[i][j];
                }
            }
        }
    }

    *returnSize = gridSize-2;
    *returnColumnSizes = calloc(gridSize-2,sizeof(int));
    for(int i = 0; i < gridSize - 2;i++) {
        (*returnColumnSizes)[i] = gridSize-2;
    }

    return arr;
}

5. 结语

请给自己些耐心,一口吃不成胖子。
山外青山楼外楼,莫把百尺当尽头。
保持空杯心态加油努力吧!


都看到这里啦!真棒(*^▽^*)

可以给作者一个免费的赞赞吗,这将会鼓励我继续创作,谢谢大家

编程小白写作,如有纰漏或错误,欢迎指正


相关推荐
reikocao1 小时前
IMU预积分误差模型推导:协方差传播、残差构建、雅可比矩阵
人工智能·线性代数·矩阵
TK泰妞6 小时前
TikTok 带货素材如何批量测试?从参考视频到内容矩阵的实操方法
线性代数·矩阵·音视频
小莞尔6 小时前
【51单片机】【protues仿真】基于51单片机超声波测距仪系统
c语言·单片机·嵌入式硬件·物联网·51单片机
学逆向的7 小时前
C 宏函数
c语言·开发语言·网络安全
Code_Solitude7 小时前
C语言:指针题型总结
c语言·开发语言
wyhwust7 小时前
程序设计基础-No5课件知识点
c语言
FLJwu7 小时前
运动相机采购选型避坑实战|第二篇
c语言·开发语言·数码相机·运动相机·oem 量产
lhbweilai8 小时前
分析FreeRTOS内核对象API的源码实现(六)
c语言·stm32·单片机
学习论之费曼学习法8 小时前
无人值守AI内容矩阵实战(7):Playwright 发布器避坑——编辑器竞态、索引延迟与风控
python·线性代数·矩阵·编辑器·浏览器自动化·playwright·踩坑记录
Brilliantwxx9 小时前
【STM32】RTC 完结篇:日期操作、闹钟中断与附录(时间戳 / 闹钟 / NTP)
服务器·c语言·stm32·单片机·嵌入式硬件·实时音视频