螺旋矩阵的思想

方阵类型

https://leetcode.cn/problems/spiral-matrix-ii/

lc59: 螺旋矩阵, 解题思路

关键点:

  1. 上方, 从左到右; 右侧,从上到下; 下方,从右到左; 左侧, 从下往上, 逆序时, 使用range( start, end, -1) 的功能;
  2. 拐角处的数值,不在当前方向上进行赋值, 留给下一个方向上 作为初始值;
  3. range( start, end) 此时range 函数中的 初始值,需要指定,因为每次向内循环时, 起始位置和终止位置都在变换;
  4. 在四个方向都进行遍历一次后,开始向内循环, 此时需要对四个方向的, 起始位置+1, 终止位置-1;
  5. 当是奇数值矩阵时, 使用 下取整的方式, 将数值赋值给 矩阵的中心点数值;
class Solution:
    def generateMatrix(self, n: int) -> List[List[int]]:

        left, right  = 0,  n-1
        top,  down = 0,  n-1 

        result =  [  [0]*n for _ in range(n)  ]
        val = 1


        while  left < right  and top < down:

             # 这里的关键点是,拐角处的边界值取不到, 拐角处的值留给下一个方向的初始值;

            # 上方, 按照从左到右开始赋值; 此时,行号固定, x 递增;   
            for x in range(left, right):  
                result[top][x] = val
                val  = val +1 

            # 右侧, 按照从上到下开始赋值; 此时, 列号固定, y 递增;
            for y in range(top, down):
                result[y][right] = val 
                val = val +1 

            # 下方, 从右往左开始赋值;
            for x in range(right, left, -1): # 使用数组倒着取值的性质;  注意, range 函数始终保持右边界值取不到;
               result[down][x] = val
               val = val +1

            # 左侧, 从下往上开始赋值;
            for y in range(down, top, -1):
                result[y][left]  = val
                val = val + 1 

            # 遍历一层循环之后, 则开始往内层, 开始新的循环
            # 此时, 起始位置 +1, 终止位置-1;  

            left = left +1
            top = top +1

            right = right -1
            down = down -1 

        # 如果是奇数值矩阵, 则将当前的数值赋值给中心点;
        if n%2 :
            result[n//2][n//2] = val
        return result

2. 非方阵类型

此代码的关键的核心思想,

  1. 每个方向上拐角处的边界值可以取到,
  2. 并且紧接着,下一个方向的起始位置往前移动一位, 其思想是因为上一个方向的拐角处的数值以及被上一个方向所包含了, 具体加一还是减一根据方向来判断。
  3. 经管在 while 循环中已经判断语句, 但是在内部循环过程中,仍然要增加两个添加判断语句, 用于确保访问的元素没有越界;
class Solution:
    def spiralOrder(self, matrix: List[List[int]]) -> List[int]:

        result = []
        m,  n =  len(matrix),  len(matrix[0])

        left, right = 0,  n-1
        top,  down  = 0,  m-1

        while left<= right  and top <= down:
            # 上方从左到右,行号保持不变, 拐角处的位置数值取到, 并且将下一个方向的起始位置+1;
            for x  in range(left, right+1, 1):
                result.append( matrix[top][x])
            top = top +1
            
            # 右边,从上到下, 列号保持不变, 拐角处的位置取到, 并将下一个方向的起始位置 +1;
            for y in range(top, down+1, 1):
                  result.append( matrix[y][right] )
            right = right -1

            if top <= down:  # 用于保证矩阵元素的访问没有越界;
            # 下方从右往左,  行号保持不变, 拐角处的位置取到,
                for  x in range(right, left-1, -1):
                    result.append( matrix[down][x])
                down = down - 1


            if  left <= right:
              #  左侧,从下往上, 列号保持不变, 拐角处的位置取到, 并将下一个方向的起始位置+1;
              for y in range(down, top-1, -1):
                 result.append(matrix[y][left])
              left = left +1
        return result        


关于第三点的原因是,
在大循环中,已经有 top<= bottom and left<= right 的判断语句, 该判断作用 是用来判断 是否存在需要遍历的行 和列;
但是, 每次遍历后, top, down, left, right 的起始位置, 终止位置的数值都是在变化, 所以需要 使用 if top<= bottom 条件判断语句, 用来确保访问的元素没有越界, 即是在按照螺旋的方式在访问元素;

while top<= bottom  and  left <= right:
   ...
   ....
   if top<= bottom:
      for...
    
   if left <= right:
      for ....

如果我们删除这些条件,遍历可能会尝试访问矩阵当前边界之外的元素,从而导致:

  1. 越界错误:尝试访问矩阵索引有效范围之外的元素。

  2. 重复元素:重新访问已包含在结果中的元素。

  3. 不正确的顺序:由于边界超限,以不遵循螺旋模式的顺序添加元素。

该图中展示了 top > bottom 的情况, 属于边界超限, 从而导致重新访问元素;请添加图片描述

请添加图片描述

请添加图片描述
请添加图片描述

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

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

相关文章

加密与解密(第四版)】第二十五章笔记

第二十五章 数据取证技术 25.1 硬盘数据的获取和固定 取证专用的Linux可启动光盘 硬盘复制机 利用取证计算机复制硬盘 手机&#xff08;JTAG&#xff09; 电子数据的固定&#xff08;HASH值&#xff09; 25.2 硬盘的分区和数据恢复 25.3 内存分析 25.4 动态仿真技术 25.…

SpringBoot——整合Thymeleaf模板

目录 模板引擎 新建一个SpringBoot项目 pom.xml application.properties Book BookController bookList.html ​编辑 项目总结 模板引擎 模板引擎是为了用户界面与业务数据分离而产生的&#xff0c;可以生成特定格式的页面在Java中&#xff0c;主要的模板引擎有JSP&…

探索Python编程世界:从基础到实战

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、Python语言简介与动态特性 代码示例&#xff1a;动态类型与变量命名 二、Python应用领…

【软件设计师】大题

一、数据流图 基础知识 数据流图&#xff08;Data Flow Diagram,DFD&#xff09;基本图形元素&#xff1a; 外部实体&#xff08;External Agent&#xff09; 表示存在于系统之外的对象&#xff0c;用来帮助用户理解系统数据的来源和去向加工&#xff08;Process&#xff09;数…

犀牛8 for Mac/Win:重塑三维建模的新标杆

在数字创意的浪潮中&#xff0c;犀牛8&#xff08;Rhinoceros 8&#xff09;作为一款卓越的三维建模软件&#xff0c;以其强大的功能和出色的性能&#xff0c;在Mac和Windows平台上都赢得了广大设计师和工程师的青睐。 犀牛8不仅继承了前代产品的优秀基因&#xff0c;更在细节…

从 0 开始本地部署大语言模型

1、准备 ● Ollama&#xff1a;ollama.com ● Docker&#xff1a;https://docs.openwebui.com/ 2、下载 Ollama 进入 Ollama 官网&#xff0c;点击 Download 。 下载完成后&#xff0c;双击安装&#xff0c;什么都不需要勾选&#xff0c;直接下一步即可。安装完成&#xf…

[读论文]精读Self-Attentive Sequential Recommendation

论文链接&#xff1a;https://arxiv.org/abs/1808.09781 其他解读文章&#xff1a;https://mp.weixin.qq.com/s/cRQi3FBi9OMdO7imK2Y4Ew 摘要 顺序动态是许多现代推荐系统的一个关键特征&#xff0c;这些系统试图根据用户最近执行的操作来捕获用户活动的“上下文”。为了捕捉…

Hive运行错误

Hive 文章目录 Hive错误日志错误SessionHiveMetaStoreClientql.Driver: FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTaskerror: Could not find or load main class org.apache.hadoop.mapreduce.v2.app.MRAppMaster Please check …

GIT 新建分支和合并分支

文章目录 前言一、新建分支二、切回老分支&#xff0c;保留新分支的更改三、合并分支 前言 本文主要针对以下场景进行介绍&#xff1a; 场景一&#xff1a;创建新的分支 当前分支(dev_1)已经开发完毕&#xff0c;下一期的需求需要在新分支(dev_2)上进行开发&#xff0c;如何创…

每日5题Day8 - LeetCode 36 - 40

每一步向前都是向自己的梦想更近一步&#xff0c;坚持不懈&#xff0c;勇往直前&#xff01; 第一题&#xff1a;36. 有效的数独 - 力扣&#xff08;LeetCode&#xff09; 题目要求我们进行判断&#xff0c;我们不需要自己填写&#xff0c;所以要一个标志位&#xff0c;来看当…

LLM——探索大语言模型在心理学方面的应用研究

1. 概述 心理学经历了多次理论变革&#xff0c;目前人工智能&#xff08;AI&#xff09;和机器学习&#xff0c;特别是大型语言模型&#xff08;LLMs&#xff09;的使用&#xff0c;预示着新研究方向的开启。本文详细探讨了像ChatGPT这样的LLMs如何转变心理学研究。它讨论了LL…

从旅游广告联想到《桃花源记》

近日收到《长江头条网》等知名网络自媒体相邀,促我写点儿旅游题材的文案。虽说笔者游历过许多名山大川的绝美风景区,但那是在70岁之前的事儿了。如今年逾78岁,纵使有少许自有资本能够支持出游,可体力难撑,岂不是花钱买罪受吗?而且,写没有亲身经历过的事挺难,即便发表出…

台灯的功能作用有哪些?护眼台灯真的护眼吗?

现在的学生会长时间使用平板、手机、电脑等&#xff0c;这些设备的屏幕会产生一定的频闪和蓝光辐射&#xff0c;也就会影响视力健康&#xff0c;而护眼养眼也成了家长关注的问题&#xff0c;视力疲劳和眼部疾病不仅影响个体的生活质量&#xff0c;还可能导致长期的健康问题。当…

装修:尽显个性品味

家&#xff0c;是心灵的港湾&#xff0c;也是生活的舞台。装修&#xff0c;不仅是对空间的改造&#xff0c;更是对生活态度的诠释。无论是温馨的北欧风&#xff0c;还是华丽的欧式古典&#xff0c;或是简约的现代感&#xff0c;我们的专业团队都能为您量身打造。每一个细节&…

力扣--哈希表13.罗马数字转整数

首先我们可以知道&#xff0c;一个整数&#xff0c;最多由2个罗马数字组成。 思路分析 这个方法能够正确将罗马数字转换为阿拉伯数字的原因在于它遵循了罗马数字的规则&#xff0c;并且对这些规则进行了正确的编码和处理。 罗马数字规则 罗马数字由以下字符组成&#xff1a…

如何使用ffmpeg 实现10种特效

相关特效的名字 特效id 特效名 1 向上移动 2 向左移动 3 向下移动 4 颤抖 5 摇摆 6 雨刷 7 弹入 8 弹簧 9 轻微跳动 10 跳动 特效展示(同时汇总相关命令) pad背景显示 pad背景透明 相关命令(一会再讲这些命令&#xff0c;先往下看) # 合成特效语音 ffmpeg -y -loglevel erro…

Pandas高效数据清洗与转换技巧指南【数据预处理】

三、数据处理 1.合并数据&#xff08;join、merge、concat函数&#xff0c;append函数&#xff09; Concat()函数使用 1.concat操作可以将两个pandas表在垂直方向上进行粘合或者堆叠。 join属性为outer&#xff0c;或默认时&#xff0c;返回列名并集&#xff0c;如&#xff…

day34 贪心算法 455.分发饼干 376. 摆动序列

贪心算法理论基础 贪心的本质是选择每一阶段的局部最优&#xff0c;从而达到全局最优。 贪心一般解题步骤&#xff08;贪心无套路&#xff09;&#xff1a; 将问题分解为若干个子问题找出适合的贪心策略求解每一个子问题的最优解将局部最优解堆叠成全局最优解 455.分发饼干 …

2024年最全的信息安全、数据安全、网络安全标准分享(可下载)

以上是资料简介和目录&#xff0c;如需下载&#xff0c;请前往星球获取&#xff1a;https://t.zsxq.com/Gz1a0

Unity3D雨雪粒子特效(Particle System)

系列文章目录 unity工具 文章目录 系列文章目录&#x1f449;前言&#x1f449;一、下雨的特效1-1.首先就是创建一个自带的粒子系统,整几张贴图,设置一下就能实现想要的效果了1-2 接着往下看视频效果 &#x1f449;二、下雪的特效&#x1f449;三、下雪有积雪的效果3-1 先把控…