螺旋矩阵算法(leetcode第885题)

题目描述:

在 rows x cols 的网格上,你从单元格 (rStart, cStart) 面朝东面开始。网格的西北角位于第一行第一列,网格的东南角位于最后一行最后一列。你需要以顺时针按螺旋状行走,访问此网格中的每个位置。每当移动到网格的边界之外时,需要继续在网格之外行走(但稍后可能会返回到网格边界)。最终,我们到过网格的所有 rows x cols 个空间。按照访问顺序返回表示网格位置的坐标列表。示例 1:输入:rows = 1, cols = 4, rStart = 0, cStart = 0
输出:[[0,0],[0,1],[0,2],[0,3]]
示例 2:输入:rows = 5, cols = 6, rStart = 1, cStart = 4
输出:[[1,4],[1,5],[2,5],[2,4],[2,3],[1,3],[0,3],[0,4],[0,5],[3,5],[3,4],[3,3],[3,2],[2,2],[1,2],[0,2],[4,5],[4,4],[4,3],[4,2],[4,1],[3,1],[2,1],[1,1],[0,1],[4,0],[3,0],[2,0],[1,0],[0,0]]提示:1 <= rows, cols <= 100
0 <= rStart < rows
0 <= cStart < cols

算法一:

思路:

分析上图,可以剖析出一个规律:

每次循环,向右向下移动相同步数,向左向上移动相同步数,并且向右向下一体,向左向上一体,这两个步数依次递增

所以我们可以改变步数与增量来实现循环

对于超范围的坐标进行判断即可

代码实现:
/*** 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().*/
# include<stdlib.h>
void pushMatrix(int **matrix,int rows,int cols,int rStart,int cStart,int *index){//存入matrixif(rStart>=rows||rStart<0)//行超范围return;else if(cStart>=cols||cStart<0)//列超范围return;else{//存入matrix[*index][0]=rStart;matrix[*index][1]=cStart;   (*index)++;}
}
int** spiralMatrixIII(int rows, int cols, int rStart, int cStart, int* returnSize, int** returnColumnSizes) {*returnSize=rows*cols;//总空间*returnColumnSizes=(int*)malloc(sizeof(int)*(*returnSize));int **matrix=(int**)malloc(sizeof(int*)*(*returnSize));//开辟m*n行,每行一个二维坐标(等同于两列),第一列为x,第二列为yfor(int i=0;i<rows*cols;i++){matrix[i]=(int*)malloc(sizeof(int)*2);(*returnColumnSizes)[i]=2;//列空间为2}int index=0,dx=1;//index-->matrix下标//dx-->循环次数int changeDx=1;//changeDx-->增量while(index<rows*cols){if(index==0){//对第一次进行特殊处理pushMatrix(matrix,rows,cols,rStart,cStart,&index);if(index==*returnSize) return matrix;}for(int i=0;i<dx;i++){cStart+=changeDx;//左右移动pushMatrix(matrix,rows,cols,rStart,cStart,&index);}for(int i=0;i<dx;i++){rStart+=changeDx;//上下移动pushMatrix(matrix,rows,cols,rStart,cStart,&index);}changeDx=-changeDx;//步长相反dx++;//循环次数加一}return matrix;
}

算法一直白代码

思路:

将while里的两个for循环分为四个for循环,对于上下左右,直观易懂,但是优化不明显

代码实现:
void judge(int rStart,int cStart,int rows,int cols,int**arr,int* rest,int*p){if(rStart>=rows||rStart<0)return;else if(cStart>=cols||cStart<0)return;else{arr[*p][0]=rStart;arr[(*p)++][1]=cStart;(*rest)--;}
}
int** spiralMatrixIII(int rows, int cols, int rStart, int cStart, int* returnSize, int** returnColumnSizes) {int rest=cols*rows;int**arr=malloc(sizeof(int*)*rest);*returnSize=rest;*returnColumnSizes=malloc(sizeof(int)*rest);for(int i=0;i<rest;i++){arr[i]=malloc(sizeof(int)*2);(*returnColumnSizes)[i]=2;}for(int r=1,p=0;rest;r+=2){//因为每走两次走的距离增加一格,走四次增加两格,所以r+=2if(!p){   //对第一次走进行特殊处理judge(rStart,cStart,rows,cols,arr,&rest,&p);if(!rest) return arr;}for(int j=0;j<r;j++)//右走(j<r)judge(rStart,++cStart,rows,cols,arr,&rest,&p);for(int j=0;j<r;j++)//下走(j<r)judge(++rStart,cStart,rows,cols,arr,&rest,&p);//注意j<r变为j<=r,相当于走的距离增加一格for(int j=0;j<=r;j++)//左走(j<=r)judge(rStart,--cStart,rows,cols,arr,&rest,&p);for(int j=0;j<=r;j++)//上走(j<=r)judge(--rStart,cStart,rows,cols,arr,&rest,&p);}return arr;
}

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

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

相关文章

GradNorm理解

主要参考这一篇&#xff0c;GradNorm&#xff1a;Gradient Normalization for Adaptive Loss Balancing in Deep Multitask Networks&#xff0c;梯度归一化_grad norm-CSDN博客 14:20-15:30 提前需要理解的概念 损失函数&#xff0c;衡量ypred与ytruth的差距。 Grad Loss定…

盲盒小程序如何盈利?创业新模式

当前&#xff0c;盲盒的影响力越来越大&#xff0c;深受年轻人的热爱&#xff0c;受众群体逐渐增加&#xff0c;盲盒的市场规模不断扩大。 在当下社交媒体时代&#xff0c;盲盒也转到了互联网上&#xff0c;根据网络的传播&#xff0c;盲盒也迎来了新一轮的发展&#xff0c;“…

python爬虫数据可视化

在Python中&#xff0c;你可以使用各种库来进行网络爬虫和数据可视化。以下是一个基本的例子&#xff0c;它使用requests库进行爬虫&#xff0c;BeautifulSoup进行HTML解析&#xff0c;pandas进行数据处理&#xff0c;和matplotlib进行数据可视化。 首先&#xff0c;我们需要安…

淘宝以图搜索商品接口 图片搜索商品列表接口 拍立淘接口

item_search_img-按图搜索淘宝商品&#xff08;拍立淘&#xff09; taobao.item_search_img 公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中…

在服务器上配置jupyter notebook便于本地访问

文章目录 需求配置1. 安装jupyter2. 生成配置文件3. 设置登录密码并生成秘钥a. 打开服务器的终端b. 设置密码 4. 修改配置文件a. 进入配置文件所在的文件夹b. 编辑配置文件jupyter_notebook_config.pyc. 保存文件 5. 在服务器上生成jupyter访问地址 关注公众号&#xff1a;『 …

C# WinForm 跨线程访问控件

写在前面 在WinForm开发中&#xff0c;经常会碰到主线程代码运行过程中需要刷新窗体控件的情况&#xff0c;如果直接在其他线程中去操作窗体控件&#xff0c;这时会抛出线程间操作无效的异常信息&#xff0c;因为窗体控件是由主线程创建的&#xff0c;C#强制要求代码必须是线程…

SAP 标准GUI 中增加按钮时报错:EC181

今天在打一个note的时候&#xff0c;需要做一些手动的调整&#xff0c;其中的步骤就需要我去在标准的GUI STATUS 增加按钮 我在进入编辑模式的时候&#xff0c;直接去插入的时候&#xff0c;始终报错如下&#xff1a; Function code xxxx has not been assigned to a functio…

使用matlab制作声音采样率转换、播放以及显示的界面

利用matlab做一个声音采样率转换、播放以及显示的界面 大抵流程&#xff1a; 图形界面创建&#xff1a;使用figure函数创建名为“声音采样率转换”的图形界面&#xff0c;并设置了其位置和大小。 按钮和文本框&#xff1a;使用uicontrol函数创建了选择音频文件的按钮、显示当前…

js基础之事件监听案例入门

事件绑定 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head&…

【IDEA】关于快捷键行注释时会从行首开始注释

前言 每次在使用IDEA写代码时&#xff0c;用快捷键进行行注释的时候&#xff0c;//会处于行首位置 但是我们想要的是这种注释效果 修改 IDEA中打开settings 找到Editor - Code Style- Java - 找到Code Genneration&#xff0c;取消勾选Line comment at first column&#x…

汽车内饰设计开发流程(入门基础)

1 开发流程简介 2 汽车内饰的子系统&#xff08;分类&#xff09; 1 软内饰&#xff08;顶棚、地毯、座椅&#xff09; 2 硬内饰&#xff08;仪表板、副仪表板护、A柱饰板、B柱饰板、C柱饰板、门槛、侧围饰板、背门饰板&#xff09; 3内外饰板的分类&#xff1a;功能件和装饰…

Linux的重定向

Linux中的重定向是将程序的输入流或输出流从默认的位置改变到指定的位置。可以使用特殊的符号来实现重定向操作。&#xff08;文中command代表命令&#xff09; &#xff08;1&#xff09;重定向命令列表 命令 说明 command > file …

第16章 网络io与io多路复用select/pool/epool

第16.1节 写一个服务端代码 服务端代码 #include <stdio.h> #include <errno.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h>#include <fcntl.h>int main() {//openint sockfd sock…

ORACLE DG 三种保护模式

– Maximum protection(最大保护模式) – Maximum availability(最大可用模式) – Maximum performance(最大性能模式) 查看dg是什么模式的 select database_role,protection_mode,protection_level from v$database; 在Maximum protection下&#xff0c; 可以保证从库和主库数…

Java集合转树结构(treeList)

java list集合转树结构&#xff08;treeList&#xff09; 我们在实际开发中&#xff0c;肯定会用到树结构&#xff0c;如部门树、菜单树等等。Java后端利用递归思路进行构建树形结构数据&#xff0c;返回给前端&#xff0c;能以下拉菜单等形式进行展示。今天&#xff0c;咱们就…

【开题报告】基于SpringBoot的影视作品网站的设计与实现

1.项目背景 影视作品网站是一个非常受欢迎的网络平台&#xff0c;它为用户提供了方便快捷的电影、电视剧、综艺等各类影视作品的信息浏览、搜索、点播和讨论交流功能。在这个平台上&#xff0c;用户可以方便地查找自己感兴趣的影视作品&#xff0c;并进行在线观看或者与其他用…

考试的最大困扰度

说在前面 &#x1f388;不知道大家对于算法的学习是一个怎样的心态呢&#xff1f;为了面试还是因为兴趣&#xff1f;不管是出于什么原因&#xff0c;算法学习需要持续保持。 1、题目描述 一位老师正在出一场由 n 道判断题构成的考试&#xff0c;每道题的答案为 true &#xff…

2697. 字典序最小回文串 --力扣 --JAVA

题目 给你一个由 小写英文字母 组成的字符串 s &#xff0c;你可以对其执行一些操作。在一步操作中&#xff0c;你可以用其他小写英文字母 替换 s 中的一个字符。 请你执行 尽可能少的操作 &#xff0c;使 s 变成一个 回文串 。如果执行 最少 操作次数的方案不止一种&#xff…

Hexo部署到云服务器后CSS样式无效的问题

Hexo部署到云服务器后CSS样式无效的问题 01 前言 趁活动入手了一个云服务器&#xff08;Linux&#xff09;&#xff0c;打算简单挂个博客上去&#xff0c;因为之前部署到github有了一些经验&#xff0c;所以还是选择使用Hexo。中间步骤略&#xff0c;部署完使用浏览器访问的时…

HT4125 低压CMOS 缓冲门器件 单电源电压转换

​​亿胜盈科HT4125 是一款低压CMOS 缓冲门器件&#xff0c;可运行在针对便携式和电池设备的更宽电压范围内。 其采用了较低阀值电路来设计此输入&#xff0c;以便匹配Vcc 3.3V 时的1.8V 输入逻辑&#xff0c;并且可被用 在1.8V 至3.3V 电平上行转换器功能中。此外&#xff0c;…