每日一题:Leetcode59. 螺旋矩阵 II

news2025/1/20 5:29:46

文章目录

系列:数组专练
语言:java & go
题目来源:Leetcode59. 螺旋矩阵 II
难度:中等
考点:边界问题的处理 & 圈数处理


思路和参考答案

  • 文章目录
  • 题目描述
  • 思路
    • java解法:
    • java参考代码
    • go参考代码:


题目描述

给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
示例 1:
在这里插入图片描述

输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]

示例 2:

输入:n = 1
输出:[[1]]

提示:

1 <= n <= 20

思路

java解法:

首先题中要求1 <= n <= 20取值范围,使用双循环不会超时;分析题中要求,需要创建一个二维数组res,一个记录数组增长的count=1,一个用来记录开始位置的start。
1.首先的话是定义圈数,围成一圈的数的个数是一个偶数,所以可以通过n%2,来判断输入的数是奇数和偶数。因为偶数会刚好围成圈,而奇数最终会在圈中间多出一个中间值。所以需要一步操作来判断是否有中间值,那奇数的话怎么求这个中间值呢?可以通过简单枚举得出,当n=3时,中间数为res[1][1],当n=5时,中间值为res[2][2],可以分析出中间值索引为圈数,值为n*n;每一圈的不同起点是通过start来计算的。为[start][start],刚开始是[0][0],过了一圈后,start+1,第二圈从[1][1]开始,之后以此类推。
2.定义好圈数,一圈四条边,每天边可以好几种遍历方式,一条边是由n个数,这里我们分析的是每条边遍历n-1个数,如下图所示:
在这里插入图片描述
思路我们有了,下面我们看具体的代码实现:

java参考代码

class Solution {
    public int[][] generateMatrix(int n) {
		int [][] res =new int [n][n];
		int num=1;
		int count =1;
		int start =0;
		int x,y;
		// n/2来确定圈数
		while(num<=n/2){
		//首先对上边界进行遍历   数组从0开始,当y=n-num时退出,刚好到右边界遍历开头
			for(y=start;y<n-num;y++){
				res[start][y] = count++;
			}
			//开始遍历右边界 数组从0开始,当x=n-num时退出,刚好到下边界遍历开头
			for(x=start;x<n-num;x++){
				res[x][y] =count++;
			}
			//此时x已经是n-num了,y是n-num,开始遍历下边界,只需要移动y即可,不需要再进行多余的遍历,保持y>=num ,结束之后y的值为0,刚好到达左边边界
			for(;y>=num;y--){
				res[x][y] = count++;
			}	
			//此时 遍历左边界,y已经到达左边界了,只需要移动x就行,需要满足x>=num,循环结束后x=0,之后又重新赋值x了,x=0时的索引值并未写进数组所以没什么影响。
			for(;x>=num;x--){
				res[x][y] = count++;
			}				
			//一圈已经结束了,开启下一圈,将圈的其实位置和圈数更新
			start++;
			num++;
		}
			//海鸥如果是奇数的话,需要求中间值,写在循环外,此时num就是n*n,因为count是先执行后++的,所以count=n*n;此时圈数也知道了,进行判断
			if(n%2 == 1){
				res[start][start] = count;
			}
	return res;
	}
}

go参考代码:

因为数组是动态的,所以在go中我们使用二维切片来进行记录索引和值
不同于java思路,在go中我们现规定了边界,,然后通过移动边界,来进行处理

	func generateMatrix(n int) [][]int {
    top,bottom:=0,n-1
    left,right:=0,n-1
    num := 1
    tar := n*n
    matrix := make([][]int,n)
    for i:=0;i<n;i++{
        matrix[i] = make([]int,n)
    }
    for num <= tar{
        for i:=left;i<=right;i++{
            matrix[top][i] =num;
            num++;
        }
        top++
        for i:=top;i<=bottom;i++{
            matrix[i][right]=num;
            num++;
        }
        right--
        for i:=right;i>=left;i--{
            matrix[bottom][i] =num;
            num++;
        }
        bottom--;
        for i:=bottom;i>=top;i--{
            matrix[i][left] =num;
            num++;
        }
        left++;
    }
    return matrix
}

以上分析,希望对您有所帮助,您的支持是我最大的动力,感谢一键三连!!

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

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

相关文章

OceanBase 4.0解读:从TPC-H性能测评看4.0与3.x差异

关于作者 肖帆 OceanBase技术专家 OceanBase技术专家&#xff0c;开源生态团队成员。毕业于华中科技大学软件工程专业&#xff0c;从事数据库领域的质量保障工作&#xff0c;曾就职于有赞、网易&#xff0c;参与关系型数据库、缓存数据库、对象存储相关产品的测试开发&#x…

.net core api调用webserver接口(详细)

这里废话不多说&#xff0c;我就不简述什么事webserver了&#xff0c;相信点进本博客的大佬都是为了解决问题。 .net core 调用webserver的话还挺简单。首先我们先有个.net core api的项目。 1.我们先注入这个HttpClient 这个内置对象&#xff0c;一会要用到。 // 注入HttpC…

Vue Hook Event 解读

前言 Hook Event (钩子事件)相信很多 Vue 开发者都没有使用过&#xff0c;甚至没听过&#xff0c;毕竟 Vue 官方文档中也没有提及。 Vue 提供了一些生命周期钩子函数&#xff0c;供开发者在特定的逻辑点添加额外的处理逻辑&#xff0c;比如: 在组件挂载阶段提供了beforeMount 和…

代码随想录day34

1005. K 次取反后最大化的数组和 题目 给你一个整数数组 nums 和一个整数 k &#xff0c;按以下方法修改该数组&#xff1a; 选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。 重复这个过程恰好 k 次。可以多次选择同一个下标 i 。 以这种方式修改数组后&#xff0c;返回数…

linux笔记(9):MangoPi-MQ(芒果派麻雀D1s)Tina系统编译烧录

文章目录1.下载相关资料1.1 WhyCan Forum(哇酷开发者社区)提供的sdk1.1.1 SDK解压过程1.2 WhyCan Forum(哇酷开发者社区)提供的补丁1.2.1 补丁包含的文件1.2.2 补丁文件和D1下面的相同文件进行合并1.2.3 引脚PD17被复用&#xff0c;导致LCD变暗&#xff0c;修改设备树2. 编译ti…

【node.js 安装】linux下安装node.js

下面我们介绍安装包安装方法 nodejs官网下载地址1 nodejs官网下载地址2 我们以官网下载地址2打开 直接下载源代码&#xff0c;rz上传到/opt/tools/ 目录下 tar -xJvf node-v18.13.0-linux-x64.tar.xz配置环境变量&#xff0c;vim /etc/profile &#xff0c;配置内容如下&am…

SFP 收发器居然有那么多种?值得收藏学习

SFP 模块具有广泛的应用范围&#xff0c;可与大部分现代网络配合使用&#xff0c;大多数可以分为四大类&#xff1a;电缆类型、传输范围、传输速率、应用。 一、电缆类型 SFP 模块可以在光纤和铜线上工作&#xff0c;根据光纤的种类&#xff0c;SFP收发器可分为与单模光纤配合…

π122E60 5.0kVrms 200Mbps 双通道数字隔离器 兼容代替Si8622BT-IS

π122E60 5.0kVrms 200Mbps 双通道数字隔离器 兼容代替Si8622BT-IS 具有出色的性能特征和可靠性&#xff0c;整体性能优于光耦和基于其他原理的数字隔离器产品。 产品传输通道间彼此独立&#xff0c;可实现多种传输方向的配置&#xff0c;可实现 5.0kVrms 隔离耐压等级和 DC 到…

Loading 用户体验 - 加载时避免闪烁

&#x1f353; 前言 在切换详情页中有这么一个场景&#xff0c;点击上一条&#xff0c;会显示上一条的详情页&#xff0c;同理&#xff0c;点击下一条&#xff0c;会显示下一条的详情页。 伪代码如下所示&#xff1a; 我们定义了一个 switcher 模版&#xff0c; 用户点击上一…

TensorRT部署YOLOv5(03)-TensorRT介绍

TensorRT是本专栏中最重要的内容,绝大多数内容将围绕TensorRT来展开,本文对TensorRT进行一个基本的介绍,让不熟悉TensorRT的读者能够对TensorRT是什么,如何使用它有一个较为全面的认识 Nvidia TensorRT是一个用于Nvidia GPU上高性能机器学习推理的SDK,对开发者屏蔽了模型…

到底什么样的 REST 才是最佳 REST?

说起 REST API&#xff0c;小伙伴们多多少少都有听说过&#xff0c;但是如果让你详细介绍一下什么是 REST&#xff0c;估计会有很多人讲不出来&#xff0c;或者只讲出来其中一部分。 今天松哥就来和大家一起来聊一聊到底什么是 REST&#xff0c;顺便再来看下 Spring HATEOAS 的…

[算法与数据结构]——并查集

目录 1. 概论 定义&#xff1a; 主要构成&#xff1a; 作用&#xff1a; 2. 并查集的现实意义 故事引入&#xff1a; 数据结构的角度来看&#xff1a; 3. find( )函数的定义与实现 故事引入&#xff1a; 实现&#xff1a; 4. join( )函数的定义与实现 故事引入&#xff1a; 实现…

c++11 标准模板(STL)(std::forward_list)(三)

定义于头文件 <forward_list> template< class T, class Allocator std::allocator<T> > class forward_list;(1)(C11 起)namespace pmr { template <class T> using forward_list std::forward_list<T, std::pmr::polymorphic_…

Apollo本地快速部署

GitHub项目地址 Gitee项目地址 Apollo&#xff08;阿波罗&#xff09;是携程框架部门研发的分布式配置中心&#xff0c;能够集中化管理应用不同环境、不同集群的配置&#xff0c;配置修改后能够实时推送到应用端&#xff0c;并且具备规范的权限、流程治理等特性&#xff0c;适…

【计算机网络-数据链路层】介质访问控制协议(MAC协议)

文章目录1 静态划分信道——信道划分 MAC 协议1.1 频分多路复用&#xff08;FDM&#xff09;——“并行”1.2 时分多路复用&#xff08;TDM&#xff09;——“并发”1.2.1 同步时分多路复用1.2.2 异步时分多路复用1.3 波分多路复用&#xff08;WDM&#xff09;1.4 码分多路复用…

数据结构进阶 AVL树

作者&#xff1a;小萌新 专栏&#xff1a;数据结构进阶 作者简介&#xff1a;大二学生 希望能和大家一起进步&#xff01; 本篇博客简介&#xff1a;介绍高阶数据结构:AVL树 AVL树AVL树的概念AVL树节点类的定义AVL树的插入AVL树的旋转左单旋右单旋左右双旋右左单旋AVL树的验证…

多线程适用接口及常见类

日升时奋斗&#xff0c;日落时自省 目录 1、Callable接口 1.1、Callable方式 1.2、非Callable方式 2、JUC&#xff08;java.util.concurrent&#xff09;的常见类 2.1、ReentrantLock 2.2、信号量Semaphore 2.3、CountDownLatch 3、线程安全的集合类 3.1、多线程使用A…

【SpringMVC】使用SpringMVC处理JSON格式的数据

目录 一、前言 二、ResponseBody 三、RequestBody 四、HttpMessageConverter 相关文章&#xff08;可以关注我的SpringMVC专栏&#xff09; SpingMVC专栏SpingMVC专栏一、前言我们在使用Servlet处理前端请求&#xff0c;使用Json格式的数据&#xff0c;通常引入外部提供的一些…

拉伯证券|利好来了,145万手封涨停!低位+低市值“无主”股揭秘

二三四五或将完毕多年“无主”局势。 周末大消息不断。蚂蚁集团1月7日在官网发布关于持续完善公司管理的公告。公告显现&#xff0c;蚂蚁集团调整首要股东投票权&#xff0c;强化与阿里巴巴集团的隔离&#xff0c;阿里巴巴开创人马云抛弃了对蚂蚁集团的实践操控权&#xff0c;蚂…

JavaScript 原型链

文章目录原型链本质 - 对象间的关联关系instanceof 和 isPrototypeOf__proto__的大致实现委托原型链 原型链就是一系列对象的链接。通常来说&#xff0c;这个链接的作用是&#xff1a;如果在对象上没有找到需要的属性或者方法引用&#xff0c;引擎就会继续在[[Prototype]]关联的…