数据结构学习(1)----数组之螺旋矩阵Ⅱ

2023-11-17

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

在这里插入图片描述
在这里插入图片描述
思路:模拟过程,设置边界。
在这里插入图片描述
生成一个 n×n 空矩阵 res(二维数组),随后模拟整个向内环绕的填入过程:
定义当前左右上下边界 l,r,t,b,初始值 num = 1,迭代终止值 tar = n * n;
当 num <= tar 时,始终按照 从左到右 从上到下 从右到左 从下到上 填入顺序循环,每次填入后:
执行 num += 1:得到下一个需要填入的数字;
更新边界:例如从左到右填完后,上边界 t += 1,相当于上边界向内缩 1。
使用num <= tar而不是l < r || t < b作为迭代条件,是为了解决当n为奇数时,矩阵中心数字无法在迭代过程中被填充的问题。
最终返回 res即可。
参考:作者:jyd

以下是Java的代码,这种解法值得学习

public int[][] generateMatrix(int n) {
        //大神解法的解读
        int left = 0, right = n-1, top = 0, bottom = n-1;
        int count = 1, target = n * n;
        int[][] res = new int[n][n];
        //for循环中变量定义成i或j的细节:按照通常的思维,i代表行,j代表列
        //这样,就可以很容易区分出来变化的量应该放在[][]的第一个还是第二个
        //对于变量的边界怎么定义:
            //从左向右填充:填充的列肯定在[left,right]区间
            //从上向下填充:填充的行肯定在[top,bottom]区间
            //从右向左填充:填充的列肯定在[right,left]区间
            //从下向上填充:填充的行肯定在[bootom,top]区间
        //通过上面的总结会发现边界的起始和结束与方向是对应的
        while(count <= target){
            //从左到右填充,相当于缩小上边界
            for(int j = left; j <= right; j++) res[top][j] = count++;
            //缩小上边界
            top++;
            //从上向下填充,相当于缩小右边界
            for(int i = top; i <=bottom; i++) res[i][right] = count++;
            //缩小右边界
            right--;
            //从右向左填充,相当于缩小下边界
            for(int j = right; j >= left; j--) res[bottom][j] = count++;
            //缩小下边界
            bottom--;
            //从下向上填充,相当于缩小左边界
            for(int i = bottom; i >= top; i--) res[i][left] = count++;
            //缩小左边界
            left++;
        }
        return res;
}

下面是js的代码

/**
 * @param {number} n
 * @return {number[][]}
 */

var generateMatrix = function(n) {
    let num = 1,t = 0,l = 0,r =n-1,b = n-1;
    const target = n*n
    const res = new Array(n).fill(0).map(()=>new Array(n).fill(0))
    while(num<=target){
        //从左到右
        for(let i = l;i <= r; i++){
            res[t][i]=num++
        }
        t++
        //从上到下
        for(let i =t ; i <= b;i++){
            res[i][r]=num++
        }
        r--
        //从右到左
        for(let i = r ;i >= l;i--){
            res[b][i]=num++
        }
        b--
        //从下到上
        for(let i = b ; i>= t;i-- ){
            res[i][l]=num++
        }
        l++
    }
    return res 
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构学习(1)----数组之螺旋矩阵Ⅱ 的相关文章

随机推荐

  • 解读:新基建为区块链带来的新机遇

    导读 区块链作为融合点对点传输 共识机制 加密算法等技术的分布式数据库技术 目前已渗透到数字金融 供应链管理 数字资产交易等多个领域 2019年10月 中共中央政治局集体学习区块链技术发展现状及趋势 2020年3月4日 中共中央政治局常务委
  • Java 【数据结构OJ题十道】—— 二叉树篇1

    文章目录 一 检查两棵二叉树是否相同 二 另一棵二叉树的子树 三 二叉树的构建及遍历 四 序列化二叉树和反序列化二叉树 难 五 二叉树创建字符串 六 二叉树前序非递归遍历实现 七 二叉树中序非递归遍历实现 八 二叉树后序非递归遍历实现 九
  • C规范编辑笔记(十二)

    往期文章 C规范编辑笔记 一 C规范编辑笔记 二 C规范编辑笔记 三 C规范编辑笔记 四 C规范编辑笔记 五 C规范编辑笔记 六 C规范编辑笔记 七 C规范编辑笔记 八 C规范编辑笔记 九 C规则编辑笔记 十 C规范编辑笔记 十一 正文 放
  • 【概率论】非连续型随机变量及概率分布

    非离散型随机变量 非离散型分布函数 设是一个随机变量 是任意实数 随机变量的分布函数 如果已知X的分布函数F x 就可以求出X落在任一区间 x1 x2 内的概率 分布函数的性质 1 2 是单调不减的 3 一维连续型随机变量概率密度 非负函数
  • 书写自己的成长情况介绍,要尽可能详尽并富有文采

    我从小生活在一个富有文化气息的家庭 父母给我最大的支持和关爱 让我拥有了一个美好的成长环境 从小我就喜欢读书 探索世界 这种兴趣也从未改变 反而越来越深入 我以优异的成绩在学校取得了卓越的成绩 学习技能不断增长 积累了丰富的知识 在大学期间
  • ipad怎么分屏方法

    如果你喜欢用Pad追剧 但是同时你又要做一些其他的事情 这个时候我们就需要ipad分屏 那具体怎么做呢 下面让我们一起来看一下吧 小白一键重装系统官网 让电脑小白也会用的win11 win10 win7一键重装系统软件 工具 原料 系统版本
  • h5手机端video autoplay兼容苹果的做法

    1 主要是加入 x5 video player fullscreen true x5 playsinline playsinline webkit playsinline 这几个属性 2 如果需要微信中支持 只能引入wx的js 在 必须在w
  • powerdesigner创建mysql数据库表_使用PowerDesigner创建表并导入到数据库

    使用PowerDesigner创建表并导入到数据库 刚刚学习使用PowerDesigner进行数据库的创建 下面我就分享一下如何创建表并导入到数据库 1 首先到网上下载一下PowerDesigner SQL Service 2008软件并安
  • vue-grid-layout 使用以及所有属性

    vue grid layout 作用 下载及引入 版本 案例 以及所有属性 作用 1 实现桌面拖拽布局功能 2 可调整每个部件的大小 3 可以在不重新构建网格的情况下添加或删除小部件 下载及引入 下载 install with npm 用n
  • Ant design vue 的table实现点击字段,直接在表格编辑功能(举个栗子)

    大概需求 就点击table上某列的字段 然后即可在table上编辑数据 数据失去焦点后即可触发保存的事件 关于无关紧要的代码 你可以不看 因为灭有用 看重点代码 1 table中添加插槽名字如 栗子 重点位置 scopedSlots cus
  • Qt信号槽的两种写法

    Qt信号槽connect是什么 connect 函数的形式 connect sender signal receiver slot type 参数示意 sender 发出信号的对象 signal 发送对象发出的信号 receiver 要接收
  • Sort List

    Merge Sort 链表的merge Sort 就是 找中间结点 算法 merge sorted List 算法 1 快慢指针法定位到中间结点p 从p前面断开 维护prev p是后半部分链表头 得到两个子链表 2 分别递归merge两个子
  • OWTTT

    如何在开放世界进行测试段训练 基于动态原型扩展的自训练方法 本文首次提出一种针对开放世界的测试段训练方法 提高模型泛化能力是推动基于视觉的感知方法落地的重要基础 测试段训练和适应 Test Time Training Adaptation
  • 【网络】静态路由的原理与配置

    路由器的工作原理 路由 是指从源主机到目标主机的转发过程 用来寻找目标地址的位置 路径 路由器 能够将数据包转发到目标地址 并保证是按最佳路径转发的设备 路由器根据路由表转发数据 并以作为工作原理 例题 下图中 主机1 1要发送数据到主机4
  • GIT统计代码量

    GIT统计代码量 Git统计个人提交代码行数 git log format aN sort u while read name do echo en name t git log author name pretty tformat num
  • 【NodeJs】使用ffmpeg将视频webm转换为mp4

    使用Chrome浏览器录制视频文件是webm格式 但是很多媒体播放器是不支持的 不利于分享 需要转换为mp4格式才行 接下来给大家讲 ffmpeg ffmpeg是什么呢 一个免费开源的视频转换工具 一款音视频编解码工具 一组音视频编解码开发
  • Python 输出有颜色的字体

    https www cnblogs com hellojesson p 5961570 html 转载于 https www cnblogs com Presley lpc p 9867058 html
  • typeAliasesPackage的作用

    mybatis和spring整合 typeAliasesPackage自动配置别名
  • JAVA——SWING界面开发

    要开发一个界面 我们一般通过写一个窗体并在这个窗体上放置其它元素组件来实现 一个界面是一个JFrame对象 代码实现如下 package com qsj login1220 public class Login public static
  • 数据结构学习(1)----数组之螺旋矩阵Ⅱ

    题目 给你一个正整数 n 生成一个包含 1 到 n2 所有元素 且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 思路 模拟过程 设置边界 生成一个 n n 空矩阵 res 二维数组 随后模拟整个向内环绕的填入过程 定义当