力扣59-螺旋矩阵 II——边界判断

题目描述

给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。

解题思路

  • 我们可以新建一个n*n的空矩阵,按照题目要求依次往进去添加数据;
  • 分别定义矩阵的上下左右边界为 t , b , l , r
  • 新建num初始化为1 每次添加后加1;
  • 以3*3矩阵为例:首先需要在第一行从左到右填充1,2,3,因此此时的循环条件应该是:
for(int i = l; i <= r; i++) arr[t][i] = num++;    t++;
  • t++的目的是将上边界(蓝色的线)向下移动,以缩小矩阵范围;
  • 接下来需要添加4,5,循环条件为:
for(int i = t; i <= b; i++) arr[i][r] = num++;    r--;
  • 绿色的右边界线向左移动,接下来填充6,7,循环条件是:
for(int i = r; i >= l; i--) arr[b][i] = num++;    b--;
  • 下边界线(红色的线)向上移动,接下来填充元素8,循环条件是:
 for(int i = b; i >= t; i--) arr[i][l] = num++;    l++;
  • 左边界线(黄色的线)向右移动,至此一轮循环结束,最外层的一层元素已经填充完毕;
  • 如果没有循环完将继续重复上面四个步骤,不断地调整四个边界线;
  • 判断是否循环完成的条件是 num <= target,num 没有超过 target 说明元素还没有填充完毕。                                                                                     

输入输出示例

代码

class Solution {
    public int[][] generateMatrix(int n) {
        int num = 1, target = n*n;
        int l = 0, r = n-1, t = 0, b = n-1;
        int[][] arr = new int[n][n];
        while(num <= target){
            for(int i = l; i <= r; i++) arr[t][i] = num++;
            t++;
            for(int i = t; i <= b; i++) arr[i][r] = num++;
            r--;
            for(int i = r; i >= l; i--) arr[b][i] = num++;
            b--;
            for(int i = b; i >= t; i--) arr[i][l] = num++;
            l++;
        }
        return arr;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值