每日一题——螺旋矩阵

简介: 每日一题——螺旋矩阵

螺旋矩阵

题目链接

解析函数形参

  • 分析理解函数形参,我们才能更好的理解题意,从而实现代码
  • 我们先来看看题目给的函数:
/**
 * 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** generateMatrix(int n, int* returnSize, int** returnColumnSizes)
  • 可以看到,函数返回的因该是一个二维数组的首地址,n应该是螺旋矩阵的行数和列数,那这个int* returnSize, int** returnColumnSizes又是什么呢?
  • 我们知道,这个函数返回的是二维数组的首地址,那判题器判题时,是用什么来确定这个二维数组的行数,以及每一行的列数呢?靠的就是int* returnSize,和int** returnColumnSizes
  • returnSize传入的是一级指针,因此原来是一个数,所以着可以代表二维数组的行数,returnColunSizes传入的是二级指针,因此原来是一个一维数组,那么这就可以用来储存二维数组每一行所包含的列数了。

思路

  • 这题很明显要利用二维数组和循环来解决问题。
  • 可能很多小伙伴看到这题觉得很简单,直接循环里面各种循环判断,结果出现了各种错误,且改了这里那里又错了。
  • 为了处理这种情况,我们就要遵守循环不变量原则,循环不变量原则就是在循环中坚持根据查找区间的定义来做边界处理,因此我们就要确定循环的区间的范围,以及区间到底是左开右闭还是左闭右开

  • 我们可以将这个正方形矩阵看成是多个正方形嵌套而成,那么我们对二维数组进行数据填入时,就可以采用对每个正方形进行数据填入的思想来处理。
  • 这里我们就用左闭右开的思想来解决,如上图,一个正方形里,不同·颜色的数据填入就用不同的循环来实现(从左到右,从上到下,从右到左,从下到上)。

具体步骤

  • 首先我们要申请一个二维数组,用来存储数据,二维数组的大小就是n个一维数组首地址的大小的和(二维数组可以粗略的看成是多个一维数组的集合),继续对这n个一维数组申请内存,大小为n个int的大小(即螺旋矩阵要存n行数据),同时还要确定这n行每一行的列数
int **res = (int **)malloc(sizeof(int*) * n); //申请一个二维数组
*returnSize = n;    //确定数组行数
* returnColumnSizes = (int *)malloc(sizeof(int) * n); //申请用来存放每一行的列数的数组的内存
for (int i = 0; i < n; i++) 
{
 res[i] = (int*)malloc(sizeof(int) * n);  //对这n个一维数组申请内存
 (*returnColumnSizes)[i] = n; //确定这n行每一行的列数
}
  • 定义left=0,right=n-1,top=0,bottom=n-1,分别代表方形的左边,右边,上边,下边,进行循环填入
while(left <= right && top <= bottom)
   {
       if(left == right && top == bottom) //对中间为一个元素的特殊情况进行处理
           res[left][top] = num;
       for(int j = left; j < right; j++)
           res[top][j] = num++;
       for(int i = top; i < bottom; i++)
           res[i][right] = num++;
       for(int j = right; j > left; j--)
           res[bottom][j] = num++;
       for(int i = bottom; i > top; i--)
           res[i][left] = num++;
       left++;
       right--;
       top++;
       bottom--;
   }

实现代码

/**
 * 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** generateMatrix(int n, int* returnSize, int** returnColumnSizes){
    int **res = (int **)malloc(sizeof(int*) * n); //申请一个二维数组
    *returnSize = n;    //确定数组行数
    * returnColumnSizes = (int *)malloc(sizeof(int) * n); //申请用来存放每一行的列数的数组的内存
    for (int i = 0; i < n; i++) 
    {
      res[i] = (int*)malloc(sizeof(int) * n); //对这n个一维数组申请内存
      (*returnColumnSizes)[i] = n;  //确定这n行每一行的列数
    }
    int num = 1;
    int left = 0, right = n - 1, top = 0, bottom = n - 1;
    while(left <= right && top <= bottom)
    {
        if(left == right && top == bottom)    //对中间为一个元素的特殊情况进行处理
            res[left][top] = num;
        //始终遵循左闭右开
        for(int j = left; j < right; j++)
            res[top][j] = num++;
        for(int i = top; i < bottom; i++)
            res[i][right] = num++;
        for(int j = right; j > left; j--)
            res[bottom][j] = num++;
        for(int i = bottom; i > top; i--)
            res[i][left] = num++;
        //缩小方形
        left++;
        right--;
        top++;
        bottom--;
    }
    return res;
}


相关文章
|
JSON 前端开发 Java
利用Spring Boot处理JSON数据实战(包括jQuery,html,ajax)附源码 超详细
利用Spring Boot处理JSON数据实战(包括jQuery,html,ajax)附源码 超详细
350 0
|
存储 资源调度 分布式计算
CDP中配置Apache Hadoop Yarn的安全性
CDP中配置Hadoop Yarn的安全性。
834 0
CDP中配置Apache Hadoop Yarn的安全性
|
7月前
|
存储 人工智能 API
DeepSeek——DeepSeek模型部署实战
本文介绍了DeepSeek大模型的本地部署方法、使用方式及API接入。首先,通过下载Ollama平台部署DeepSeek-R1模型,提供7种不同参数版本(1.5b至671b),用户可根据硬件选择合适的模型大小。接着,文章详细描述了如何在终端运行命令启动模型,并通过Chatbox官网下载并接入DeepSeek API,实现本地和云端模型的交互。最后,提及了DeepSeek官网和集成工具如POE的使用,帮助用户更好地利用DeepSeek进行开发和应用。
|
9月前
|
搜索推荐 Android开发 开发者
探索安卓系统的最新特性与发展趋势
本文深入分析了Android 13的新功能和改进,以及这些更新对用户体验和开发者社区的影响。文章还预测了未来Android系统的发展方向,为技术爱好者提供了宝贵的信息。
|
监控 数据挖掘 关系型数据库
结构化思维的理解与思考
结构化思维是一种将信息要素从无效转化为有序,提炼核心要点,将信息转化为有结构的知识,更好的帮助大脑理解和记忆,并支持我们清晰表达的通用能力。
1466 2
结构化思维的理解与思考
|
图形学
【用unity实现100个游戏之18】从零开始制作一个类CSGO/CS2、CF第一人称FPS射击游戏——基础篇2(附项目源码)
【用unity实现100个游戏之18】从零开始制作一个类CSGO/CS2、CF第一人称FPS射击游戏——基础篇2(附项目源码)
275 0
|
监控 安全 数据安全/隐私保护
SNMPv3:网络管理的安全进化
【4月更文挑战第22天】
459 4
|
网络协议 数据安全/隐私保护 网络架构
通俗科普:网关是什么?
通俗科普:网关是什么?
8516 0
|
机器学习/深度学习 算法
【MATLAB第56期】#源码分享 | 基于MATLAB的机器学习算法单输入多输出分类预测模型思路(回归改分类)
因上一步骤进行了正常的回归预测,输出一般为小数点,且不是限定标签的数值。所以需要通过find函数,将回归预测的输出结果进行分段赋值。若涉及多隐含层,可修改[20,20,5]中的数字。前2个20代表两层隐含层的神经元数 ,后面的5为输出节点,根据本案例数据设置。输出分为五个指标,每个指标共4个评分维度,即【0 10 20 30】归一化区间可自行设置,默认[-1,1],本文采用[0,1]根据四舍五入的思路,如数据如果在5以下,则赋值为0,数据为1输入,5输出,总共482个样本。如果为[5,15),赋值为10…
【MATLAB第56期】#源码分享 | 基于MATLAB的机器学习算法单输入多输出分类预测模型思路(回归改分类)