leetcode刷题记录(五)——59.螺旋矩阵II

(一)问题描述

leetcode题目链接. - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。icon-default.png?t=O83Ahttps://leetcode.cn/problems/spiral-matrix-ii/      给你一个正整数 n ,生成一个包含 1 到 n的平方所有元素,且元素按顺时针顺序螺旋排列的 n×n 正方形矩阵 matrix 。

示例1:

输入:n=3

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

示例2:

输入:n=1

输出:[[1]]

提示:1<=n<=20

(二)解题思路

       这道题没有用到复杂的算法,就是对整个数组螺旋的过程进行模拟:螺旋一圈有四条边需要填充,分别填充这四条边就可以了。

      这里正方形矩阵要填充的圈数,n为偶数时是n/2, n为奇数时是n/2+1。判断方式:想象把矩阵横着从中间切一刀,一半里有几行就是填几圈。对于n为奇数的矩阵,最后一圈就是中心的那一个元素,所以最后单独判断一下n的奇偶,奇数就单独填充一下中间的元素。

伪代码:

generateMatrix (n)

//顺时针螺旋填充正方形矩阵

//输入:正方形矩阵的边长n

//输出:填充后的正方形矩阵result

int val←0, k←0  // val代表当前填充的值,k代表当前填充的是第几圈

int startx, starty //当前圈的起始坐标

int i,j //当前填充元素的坐标,默认i是行坐标,j是列坐标

int result[][] //结果二维数组

while k<=n/2 

     for j=starty; j<n-k; j++  //填充当前圈的上边

          result [i][j] =val++

     for i=startx; i<n-k; i++ //填充当前圈的右边

          result [i][j] =val++

     for j=n-k; j>starty; j--  //填充当前圈的下边

          result [i][j] =val++

     for i=startx; i>startx; i++ //填充当前圈的左边

          result [i][j] =val++

     k++       //这圈结束了,更新圈数

     startx++ //更新下一圈的起始位置

     starty++ 

if n%2!=0

     result[n/2][n/2]=n*n

return result

(三)易错点

1. 控制循环不变量。每条边对于端点的处理规则应当一致。第一条边处理时需要包含起始点,那么之后每一条边都需要包含起始点,因此每一条边不应该包含终点(即下一条边的起始点,不然下一条边的处理就不能包含起始点了,每次循环的条件就没法保持一致了)。

2. startx和starty等于k-1,而不是k。

3. 在Java中,n^2不等于n*n。n^2表示异或运算,不是平方。表示平方可以用n*n,或Math.pow(n,2).

2. 不是所有问题都有对应的算法,有可能实际写出来的代码就是比较长,要敢写。这道题就没有对应的算法,只是对顺时针螺旋的过程进行模拟。while循环里要包含4个for循环来填充四条边。我一开始想到了这样写,但觉得不可能是这种笨解法,肯定有简便方法,最后就没有这样写。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值