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

文章目录

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

1. 每日一言

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


2. 题目

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

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

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

maxLocal[i][j] 等于 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 == grid[i].length

3 <= n <= 100

1 <= grid[i][j] <= 100


3. 解题思路

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

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


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

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

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


相关推荐
SunnyByte14 分钟前
C语言——贪吃蛇的实现
c语言·单链表·贪吃蛇
im_AMBER4 小时前
手撕hot100之矩阵!看完这篇就AC~
javascript·数据结构·线性代数·算法·leetcode·矩阵
笨笨饿4 小时前
#79_NOP()嵌入式C语言中内联汇编宏的抽象封装模式研究
linux·c语言·网络·驱动开发·算法·硬件工程·个人开发
weixin_421725264 小时前
C语言中volatile关键字怎么用C语言volatile在多线程中的作用
c语言·数据结构·运算符优先级·变量命名·volatile关键字
星河耀银海5 小时前
C语言与数据库交互:SQLite实战与数据持久化
c语言·数据库·sqlite·交互
Wadli6 小时前
hot100|矩阵
线性代数·矩阵
05候补工程师6 小时前
【408 从零到一】线性表逻辑特征、存储结构对比与 C/C++ 动态内存分配避坑指南
c语言·开发语言·数据结构·c++·考研
傻瓜搬砖人6 小时前
第五章习题
c语言·谭浩强·绿皮书第三版
华清远见成都中心7 小时前
C 语言内存管理深度解析:malloc/free 与嵌入式堆栈分配策略
java·c语言·算法
努力努力再努力wz7 小时前
【MySQL 进阶系列】拒绝滥用root:从 mysql.user 到权限校验,带你彻底理解用户管理与授权机制!
android·c语言·开发语言·数据结构·数据库·c++·mysql