代码随想录刷题-数组-螺旋矩阵II

news2024/10/7 10:18:36

文章目录

    • 螺旋矩阵 II
      • 习题
      • 我的解法
      • 别人的解法

螺旋矩阵 II

本节对应代码随想录中:代码随想录,讲解视频:一入循环深似海 | LeetCode:59.螺旋矩阵II_哔哩哔哩_bilibili

习题

题目链接:59. 螺旋矩阵 II - 力扣(LeetCode)

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

示例 1:
输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]
在这里插入图片描述

我的解法

题目有点像本科时做过的迷宫类题目,数字的增长顺序为右、下、左、上,然后接着按照这个顺序填充。

那么就可以定义一个数组表示每个方向的 x 和 y 应该如何变化,再定义一个 n*n 的数组表示是否访问过当前位置

按照右、下、左、上的顺序去填充矩阵,如果下一个位置在矩阵范围内并且还没有访问过那就填充,否则说明走到头该换方向了,代码如下。

class Solution {
   public:
    vector<vector<int>> generateMatrix(int n) {
        // 4个方向:右下左上
        int dir[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
        vector<vector<int>> nums(n,vector<int>(n));
        
        int count = 1;  // 计数
        int x = 0, y = 0, d = 0;    // x和y的坐标,d代表当前方向

        // 是否填充过当前位置
        int isV[n][n];
        for(int i=0; i<n; i++){
            for(int j=0; j<n; j++){
                isV[i][j] = 0;
            }
        }
        // 初始填充[0][0]位置
        nums[0][0]=count;
        isV[0][0]=1;

        while (1) {
            if (count == n * n) {
                break;
            }
            int newX= x + dir[d][0],newY=y + dir[d][1]; // 新的位置
            // 判断新的位置是否符合矩阵范围内并且没有访问过
            if (newX <= n - 1 && newY <= n - 1 && newX >= 0 && newY >= 0 && isV[newX][newY]!=1) {
                x = newX;
                y = newY;
                count++;
                nums[x][y] = count;
                isV[x][y] = 1;

            } else {
                // 到此步,说明走到头了,要改变方向
                d = (d + 1) % 4;
            }
        }
        return nums;
    }
};

看了别人的解法,有几个点可以注意下:

  • vector<vector<int>> nums(n,vector<int>(n)); 这种定义会默认全部初始为0,而 int nums[4][4]; 则不会初始为0,需要手动初始化为0
  • 二维数组 isV[n][n] 初始化为0时,不必使用双重 for 循环,可以用 int isV[n][n]={0}; 快速初始化
  • while(1) 可以换成 while (count <= n * n),这样就不用专门去判断 count 是否等于 n*n 然后 break 了

别人的解法

代码随想录中的解法有点复杂了,这里就不分析了,附上在 LeetCode 官方题解评论区下看到的一个不错的题解
来源:59. 螺旋矩阵 II 题解 - 力扣(LeetCode)

我的想法是定义一个方向数组,循环这个方向数组,并且还要用另一个数组记录每个位置是否已经访问过。而这个题解省去了方向数组和定义否访问过的数组的创建过程。直接用4个 for 循环代表4个方向,外层用 while 来判断是否填充到了最后一个位置。

代码中的 up、down、left、right 分别代表着当前需要填充区域的上下左右边界,在向前走一个方向要转弯的时候要改变一下边界的数值

class Solution {
   public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> res(n,vector<int>(n));
        // 分别代表着当前需要填充区域的上下左右边界
        int up = 0, down = n - 1, left = 0, right = n - 1, index = 1;
        while (index <= n * n) {
            // 从左向右赋值
            for (int i = left; i <= right; i++) {
                res[up][i] = index++;
            }
            up++; // 上面的一行赋值后上边界应该下移一行,下同
            // 从上向下赋值
            for (int i = up; i <= down; i++) {
                res[i][right] = index++;
            }
            right--;
            // 从右向左赋值
            for (int i = right; i >= left; i--) {
                res[down][i] = index++;
            }
            down--;
            // 从下向上赋值
            for (int i = down; i >= up; i--) {
                res[i][left] = index++;
            }
            left++;
        }
        return res;
    }
};

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

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

相关文章

将spring boot项目打包成一个可执行的jar包

将spring boot项目打包成一个可执行的jar包&#xff0c;jar包自带了整个运行环境简化配置&#xff0c;可直接运行&#xff0c;本次使用HelloWorld项目演示。 创建Spring Boot项目在pom.xml中导入插件 <build><plugins><plugin><groupId>org.springfr…

计算机网络:移动IP

移动IP相关概念 移动IP技术是移动结点&#xff08;计算机/服务器&#xff09;以固体的网络IP地址&#xff0c;实现跨越不同网段的漫游功能&#xff0c;并保证了基于网络IP的网络权限在漫游中不发生任何改变。移动结点&#xff1a;具有永久IP地址的设备。归属代理&#xff08;本…

西瓜播放器全屏功能源码分析

H5业务中使用了西瓜播放器&#xff0c;嵌入各个APP&#xff0c;全屏时候会有相应的差异。带着好奇心&#xff0c;阅读一下xgpplayer全屏功能部分源代码。源码地址一、工具方法其他方法看名称就知道是dom操作相关&#xff0c;无需多说&#xff0c;上面这两个工具方法主要用来检测…

数学建模资料整理

数学建模中有三类团队&#xff1a; 第一类&#xff1a;拿到题目&#xff0c;讨论&#xff0c;然后建模手开始建模&#xff0c;编程手开始处理数据&#xff0c;写作手开始写作。 第二类&#xff1a;拿到题目&#xff0c;团内大佬&#xff0c;开始建模&#xff0c;然后编程&#…

【GAOPS055】verilog 乘法、除法和取余

乘法硬件原理结论思路1思路2举例编码仿真综合除法硬件原理verilog代码仿真结果资源占用乘法硬件原理 结论 可以将乘法A x B转为A的移位相加。 利用乘2n就是左移n位的特性乘2^n就是左移n位的特性乘2n就是左移n位的特性&#xff0c;将数拆分为2n2^n2n表示 思路1 原始列竖式计…

【C++】通过priority_queue、reverse_iterator加深对于适配器和仿函数的理解

苦尽甘来 文章目录一、仿函数&#xff08;仿函数就是一个封装()运算符重载的类&#xff09;1.C语言的函数指针2.C的仿函数对象二、priority_queue中的仿函数1.模拟实现优先级队列1.1 优先级队列的本质&#xff08;底层容器为vector的适配器&#xff09;1.2 向下调整算法建堆1.3…

git添加子模块(submodule)

git添加子模块(submodule) 背景 有时候自己的项目需要用到别人的开源代码&#xff0c;例如 freertos 和 tinyusb 这个时候有两种选择 将开源的代码下载下来放到自己的 git 中管理 缺点&#xff1a;如果远端仓库更新&#xff0c;自己仓库的代码不会更新 将开源代码通过子模块…

2023河北沃克HEGERLS甘肃金昌重型仓储项目案例|托盘式四向穿梭车智能密集存储系统在工业行业的创新应用

项目名称&#xff1a;自动化仓储托盘式四向穿梭车智能密集立体库项目 项目合作客户&#xff1a;甘肃省金昌市某集团企业 项目施工地域&#xff1a;甘肃省金昌市 设计与承建单位&#xff1a;河北沃克金属制品有限公司&#xff08;自主品牌&#xff1a;海格里斯HEGERLS&#x…

Mysql的Explain关键字

引入 MySQL为我们提供了 explain 关键字来直观的查看一条SQL的执行计划 概念 1.id SELECT识别符&#xff0c;这是SELECT的查询序列号 2.select_type 查询类型 SIMPLE:简单SELECT(不使用UNION或子查询) PRIMARY:最外面的SELECT UNION:UNION中的第二个或后面的SELECT语句 DEPEND…

你的游戏帐号是如何被盗的

据报道&#xff0c;2022上半年&#xff0c;中国游戏市场用户规模达到了5.54亿人&#xff0c;游戏市场销售收入1163.1亿元&#xff0c;相较去年均为同比增长的情况。如此庞大的市场规模&#xff0c;黑色产业链是绕不开的话题。 但相较于游戏中大家常见的玩家与玩家、玩家与官方…

一维连续型随机变量函数的分布例题(一)

设随机变量X的概率密度为&#xff0c;求Y2X8的概率密度。 令g(x)Y&#xff0c;即g(x)2X8。我们可以得到Y的值域为(8,16)。 方法一&#xff1a;看看Y是不是单调可导的函数 此处Y单调可导。 然后求Y的反函数&#xff0c;即。再对h(x)求导可得。 再由公式我们可得 再补上定义域…

[洛谷-P1273]有线电视网(树形DP + 分组背包DP)

[洛谷-P1273]有线电视网&#xff08;树形DP&#xff09;一、题目内容题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1提示二、思路分析三、代码一、题目内容 题目描述 某收费有线电视网计划转播一场重要的足球比赛。他们的转播网和用户终端构成一棵树状结构&#xff…

Nacos配置拉取及配置动态刷新原理【源码阅读】

Nacos配置拉取及配置刷新原理 一、初始化时获取配置文件 背景 SpringCloud项目中SpringBoot在启动阶段除了会创建SpringBoot容器&#xff0c;还会通过bootstrap.yml构建一个SpringCloud容器&#xff0c;之后会在准备上下文阶段通过SPI加载实现类后&#xff0c;会进行配置合并…

Linux(传输层二)

文章目录0. 前言1. TCP协议1-1 TCP协议段格式1. TCP如何解包&#xff1f;2. TCP协议如何交付&#xff08;应用层- - 客户&#xff09;&#xff1f;3. 如何理解报文本身&#xff1f;4. 如何理解报文字段&#xff1f;1-2 确认应答(ACK)机制1-3 超时重传机制1-4 连接管理机制1. TC…

Kafka中那些巧妙的设计

一、kafka的架构 Kafka是一个分布式、多分区、基于发布/订阅模式的消息队列&#xff08;Message Queue&#xff09;&#xff0c;具有可扩展和高吞吐率的特点。 kafka中大致包含以下部分&#xff1a; Producer&#xff1a; 消息生产者&#xff0c;向 Kafka Broker 发消息的客户…

Vue3+TS项目中element-plus自动导入组件后,找不到文件

问题 原因 从报错代码来看&#xff0c;这是一个ts错误&#xff0c;而且是找不到名称 是没有将*.d.ts文件加入到tsconfig.json配置文件中&#xff0c;所以Typescript还不认识它们 解决 //找到项目根目录下 tsconfig.json配置文件 {"include": ["src/**/*.ts…

OpenAI-J 如何进行测试

当你检出 OpenAI-J 项目以后&#xff0c;你可以对 OpenAI-J 进行测试。在测试之前你首先需要获得 OpenAI 的 API Key。OpenAI 的 Key通常是以 sk 开头的字符串。最简单粗暴的办法就是把获得的 key 替换掉上面的字符串&#xff0c;然后进行测试就可以了。运行 Unit 测试在我们的…

Win11的两个实用技巧系列之无法联网怎么办、耳机没声音的多种解决办法

Win11无法联网怎么办? win11安装后设备不能上网的解决办法Win11无法联网怎么办&#xff1f;电脑安装win11系统以后&#xff0c;发现不能上网&#xff0c;连接不上网络&#xff0c;该怎么办呢&#xff1f;下面我们就来看看win11安装后设备不能上网的解决办法Win11安装后&#x…

初级篇 3 - HTML 或 CSS 文件中不懂的标签属性详解

目录一、遇到的不懂的标签属性详解1、meta 标签的 http-equiv 属性(元标签)二、遇到的 CSS 不懂的属性详解vertical-align三、如何规避 HTML 自动换行 - 脱离文档流配置属性 display: inline-block理解 inline、inline-block、blockinline总结&#xff1a;四、导航栏自动弹出子…

BaiduMapApi 实现ip城市获取

第一步申请百度map AK第二步 查看 百度api服务文档第三步 编写 api工具类import com.alibaba.fastjson.JSONException; import com.alibaba.fastjson.JSONObject; import org.springframework.stereotype.Component; import java.io.BufferedReader; import java.io.IOExceptio…