代码随想录 数组test5(leetcode 59.螺旋矩阵)

59. 螺旋矩阵 II - 力扣(LeetCode)

大致的想法是从起点开始以顺时针走到中心,有两种实现方式:一圈一圈赋值或者每走一步就赋值

方法一:按圈循环

思路:

        外层循环是要循环的圈数,这里需要分奇偶讨论,若题目给出的n为偶数

        由图可知,此图n等于6(6*6的格子),红色方框为遍历的圈,因此圈数为3,通过观察可知,红框数可以只看绿色线条穿过的红色边框的数量,也为3,而红色边框的数量就是每行格子数量的一半。因此循环的圈数为n/2。

        若n为奇数:

        和偶数类似,通过观察可以发现圈数也为n/2(下取整),但遍历完所有圈后剩余中心位置,需要最后补充。

        按照以左上角为起点,设其坐标(x,y)初始为(0,0),每一圈需要知道当前的起点,显然每次遍历完起点都会向右下移动即(x+1,y+1)。然后从当前的起点开始进行赋值,要保证每一圈赋值都符合内层的规则,因此可以将循环不变量设置为从起点开始赋值,一直赋值到当前方向的倒数第二个未被赋值的格子,可以借助变量dis记录该方向走到距离边界多少个格子停止。所以每一圈可以分成四方向的运动,不妨设置为顺时针方向,每一步的坐标为(i,j)(行,列),因此第一个方向(j)从当前起点开始,一直到倒数第二个未被赋值的格子(n-dis)停止;第二个方向(i)是从上个方向的终点开始向下到(n-dis)停止;第三个方向(j)是从上一个方向开始,到(n-dis)停止,第四个方向同理。当这一圈结束后,来到的是(x+1,y)位置。下一圈刚好是在该位置的右侧,保证了每圈的赋值规则不变只需改变起点和dis即可。

        最后,如果为奇数,需要给中心位置赋值。

代码:

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {

        vector<vector<int>> res(n,vector<int>(n, 0));
        
        int x = 0, y = 0 ;//每圈遍历的起始坐标
        int dis = 1;//每圈遍历距离边界的长度
        int turn = n / 2;//需要转几圈,偶数正好,奇数需要最后对中心赋值
        int count = 1 ;//为每一个位置赋值
        int i, j;//每次移动时的坐标

        while(turn){
            i = x, j = y;

            for(j; j < n - dis; j++)  res[i][j] = count++;
            for(i; i < n - dis; i++)  res[i][j] = count++;
            for(; j > y; j--)   res[i][j] = count++;
            for(; i > x; i--)   res[i][j] = count++;

            x++, y++, dis++;
            turn--;
        }

        if(n % 2) res[n / 2][n / 2] = count;
        
        return res;
    }
};

方法二:按位置赋值

思路:

        该方法详细参考59. 螺旋矩阵 II - 力扣(LeetCode)题解,主要思想为收缩可以赋值的格子,沿第一个方向起点为当前左边界,终点为当前右边界,走完就将上边界收缩(此时可赋值的范围被压缩成下面部分),之后沿第二个方向,起点为当前上边界,终点为当前下边界,走完将右边界收缩,之后沿第三个方向,起点为当前右边界,终点为当前左边界,走完将下边界收缩,之后沿第四个方向,起点为当前下边界,终点为当前上边界,走完将左边界收缩,可以发现可赋值的范围和循环进行过程是同步的。

代码:

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {

        vector<vector<int>> res(n,vector<int>(n, 0));
        
        int l = 0, r = n - 1, t = 0, b = n - 1;
        int sum = n * n, count = 1;

        while(count <= sum){
            for(int i = l; i <= r; i++) res[t][i] = count++;//在当前最上侧赋值
            t++;//收束上边界
            for(int i = t; i <= b; i++) res[i][r] = count++;//在当前最右侧赋值
            r--;//收束右边界
            for(int i = r; i >= l; i--) res[b][i] = count++;//在当前最下侧赋值
            b--;//收束下边界
            for(int i = b; i >= t; i--) res[i][l] = count++;//在当前最左侧赋值
            l++;//收束左边界
        }

        return res;
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

向成电子XC3588H工控主板助力内窥镜应用升级

随着微创手术在全球范围内普及&#xff0c;内窥镜应用越来越广泛。利用内窥镜&#xff0c;医生可以看到X射线不能显示的病变&#xff0c;对医疗诊断有非常重要的作用。内窥镜设备凝聚了先进的影像技术&#xff0c;提供高画像精度诊断微小的病变。在设备智能化的今天&#xff0c…

基于SpringBoot的音乐网站与分享平台

基于SpringBoot的音乐网站与分享平台 摘要1. 研究背景2.研究内容3.系统功能 3.1前台首页功能模块3.2在线听歌功能模块3.3后台登录功能模块3.4在线听歌管理模块 4.部分功能代码实现5.源码分享(免费获取) 需要源码联系我即可(免费获取)~ ??大家点赞、收藏、关注、评论啦 、查…

nginx-灰度发布策略(split_clients)

一. 简述&#xff1a; 基于客户端的灰度发布&#xff08;也称为蓝绿部署或金丝雀发布&#xff09;是一种逐步将新版本的服务或应用暴露给部分用户&#xff0c;以确保在出现问题时可以快速回滚并最小化影响的技术。对于 Nginx&#xff0c;可以通过配置和使用不同的模块来实现基于…

【数据结构】栈与队列(FIFO)

在阅读该篇文章之前&#xff0c;可以先了解一下堆栈寄存器和栈帧的运作原理&#xff1a;<【操作系统】堆栈寄存器sp详解以及栈帧>。 栈(FILO) 特性: 栈区的存储遵循着先进后出的原则。 例子: 枪的弹夹&#xff0c;最先装进去的子弹最后射出来&#xff0c;最后装入的子弹…

python基础案例

#一个年份如果能被4整除但不能被 100整除&#xff0c;或能被 400整除&#xff0c;那么这个年份就是闰年。 year int(input(请输入年份&#xff1a;)) if (year %40 and year %100!0) or year %4000:print("这个年份就是闰年") else:print("这个年份不是闰…

微服务框架,Http异步编程中,如何保证数据的最终一致性

一、背景 在微服务框架下&#xff0c;跨服务之间的调用&#xff0c;当遇到操作耗时或者量大的情况&#xff0c;我们一般会采用异步编程实现。 本文出现的问题是&#xff1a;异步回调过来时&#xff0c;却未查询到数据库中的任务&#xff0c;导致未能正常处理回调。 下面是当…

Kafka详解 ③ | Kafka集群操作与API操作

目录 1、Kafka集群操作 1.1、创建 topic 1.2、查看主题命令 1.3、生产者生产 1.4、消费者消费数据 1.5、运行 describe topics命令 1.6、增加 topic分区数 1.7、增加配置 1.8、删除配置 1.9、删除 topic 2、Kafka的Java API操作 2.1、生产者代码 2.2、消费者代 2…

Echarts集成Vue2个人总结与反思

协同净焦水处理系统 统计模块 环境部署 1、创建数据库ry-cloud并导入数据脚本ry_2021xxxx.sql&#xff08;必须&#xff09;&#xff0c;quartz.sql&#xff08;可选&#xff09; 2、创建数据库ry-config并导入数据脚本ry_config_2021xxxx.sql&#xff08;必须&#xff09; …

aardio —— 虚表 —— 模拟属性框

写了个简单的属性框例程&#xff0c;抛砖引玉&#xff0c;期待你做出更丰富强大的功能。 本例演示&#xff1a;折叠子行、选择框、输入文本、输入数值、下拉选择、选择图片、选择颜色、选择字体等功能。 只有想不到&#xff0c;没有做不到&#xff0c;发挥你的想象力吧。 imp…

《Vue3 七》插槽 Slot

插槽可以让组件的使用者来决定组件中的某一块区域到底存放什么元素和内容。 使用插槽&#xff1a; 插槽的使用过程其实就是抽取共性、预留不同。将共同的元素、内容依然留在组件内进行封装&#xff1b;将不同的元素使用 slot 作为占位&#xff0c;让外部决定到底显示什么样的…

Functions

1.trigonometric function 定义和图像 反三角函数是三角函数的反函数 versin(verse -sin)&#xff1a;1/sinx 性质 三角函数的公式 三角恒等式 周期性公式&#xff1a;直接画图记 公式记忆&#xff1a;先想象一个在第一象限的锐角 1&#xff1a;在坐标轴中旋转360 2.sin&am…

微服务-网关、配置热更新、动态路由

祝小伙伴们每天开心 每天都能进步一点点 目录 1 网关路由 1.1 认识网关 什么是网关捏 网关实现方案 1.2 快速入门 &#xff08;1&#xff09;引入依赖 &#xff08;2&#xff09;配置路由 1.3 路由过滤 路由规则语法 常见属性 predicates&#xff08;路由断言&…

uni-app 资源引用(绝对路径和相对路径)方法汇总

文章目录 一、前言&#x1f343;二、绝对路径和相对路径2.1 绝对路径2.2 相对路径 三、引用组件四、引用js4.1 js 文件引入4.2 NPM支持 五、引用css六、引用json6.1 json文件引入 七、引用静态资源7.1 模板内引入静态资源7.2 css 引入静态资源7.3 js/uts 引入静态资源7.4 静态资…

机器学习基础-支持向量机SVM

目录 基本概念和定义 1. 超平面&#xff08;Hyperplane&#xff09; 2. 支持向量&#xff08;Support Vectors&#xff09; 3. 线性可分 4. 边界 SVM算法基本思想和分类 基本思想 间隔最大化 间隔&#xff08;Margin&#xff09; 软边距 SVM 核函数的概念 基本概念…

TypyScript从入门到精通

TypyScript从入门到精通 TypyScript 是什么&#xff1f;增加了什么环境搭建二、为何需要 TypeScript三、编译 TypeScript四、类型声明五、类型推断基本类型六、类型总览JavaScript 中的数据类型TypeScript 中的数据类型1. 上述所有 JavaScript 类型2. 六个新类型&#xff1a;3.…

mybatisX插件的使用,以及打包成配置

装mybatisX插件&#xff1b; idea连接数据库&#xff1b; 点击mybatisx-generator&#xff0c;设置自己装mybatisX插件&#xff1b; idea连接数据库&#xff1b; 点击mybatisx-generator&#xff0c;设置自己要的包和类&#xff1b; 如果要把自己的配置设置成一个自定义模板&a…

简单的jmeter数据请求学习

简单的jmeter数据请求学习 1.需求 我们的流程服务由原来的workflow-server调用wfms进行了优化&#xff0c;将wfms服务操作并入了workflow-server中&#xff0c;去除了原来的webservice服务调用形式&#xff0c;增加了并发处理&#xff0c;现在想测试模拟一下&#xff0c;在一…

Java后端常用的4种请求方式(通俗易懂)

文章目录 前言通用接口类(ControllerDemo)通用实体类(UserEntity)通用响应类(HttpClientResult)成功截图(先启动项目,然后右键执行main方法) HttpClientHttpClient 的主要类代码案例导入依赖工具类(HttpClientUtil)测试类 HttpURLConnection简介调用步骤代码案例导入依赖工具类…

floodfill算法_dfs

之前我们用BFS解决floodfil算法 BFS 解决 FloodFill 算法_图像渲染_岛屿数量_被围绕的区域-CSDN博客 下面我们用dfs进行解决 733. 图像渲染 从初始位置开始dfs&#xff0c;找和它值相同的&#xff0c;并在dfs过程中把值改为目标值。因为会改变原数组&#xff0c;不用vis记录经过…

40% 降本:多点 DMALL x StarRocks 的湖仓升级实战

小编导读&#xff1a; 多点 DMALL 成立于2015年&#xff0c;持续深耕零售业&#xff0c;为企业提供一站式全渠道数字零售解决方案 DMALL OS。作为 DMALL OS 数字化能力的技术底座&#xff0c;大数据平台历经多次迭代平稳支撑了公司 To B 业务的快速开展。随着国家产业升级和云原…