螺旋矩阵的思想

news2024/10/6 10:25:58

方阵类型

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 的情况, 属于边界超限, 从而导致重新访问元素;请添加图片描述

请添加图片描述

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

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

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

相关文章

c语言:将小写字母转换为大写字母

//将小写字母转换为大写字母 #include <stdio.h> #include <ctype.h> int main() { char arr[]"you are low"; int i0; while(arr[i]) { if(islower(arr[i])) { arr[i]arr[i]-32; } i; } printf("%s\n",arr); return 0; }

iCloud 照片到 Android 指南:帮助您快速将照片从 iCloud 传输到安卓手机

​ 概括 iOS 和 Android 之间的传输是一个复杂的老问题。将 iCloud 照片传输到 Android 似乎是不可能的。放心。现在的高科技已经解决了这个问题。尽管 Apple 和 Android 不提供传输工具&#xff0c;但您仍然有其他有用的选项。这篇文章与您分享了 5 个技巧。因此&#xff0c;…

Vue3实战笔记(42)—Vue + ECharts:流量数据可视化的强大组合

文章目录 前言vue3使用echarts标准demo&#xff1a;总结 前言 在前端开发中&#xff0c;数据可视化已经成为了一个不可或缺的部分。Vue.js作为一个轻量级且易于上手的渐进式JavaScript框架&#xff0c;与ECharts这个强大的数据可视化库的结合&#xff0c;使得在Vue应用中构建交…

【30天精通Prometheus:一站式监控实战指南】第8天:redis_exporter从入门到实战:安装、配置详解与生产环境搭建指南,超详细

亲爱的读者们&#x1f44b;   欢迎加入【30天精通Prometheus】专栏&#xff01;&#x1f4da; 在这里&#xff0c;我们将探索Prometheus的强大功能&#xff0c;并将其应用于实际监控中。这个专栏都将为你提供宝贵的实战经验。&#x1f680;   Prometheus是云原生和DevOps的…

散列(哈希)及其练习题(基础)

目录 散列 字符出现次数 力扣经典题&#xff1a;两数之和 集合运算 交 并 差 字符串的出现次数 散列 导入&#xff1a; 有N个数和M个数&#xff0c;如何判断M个数中每个数是否在N中出现&#xff1f; 思想&#xff1a;空间换时间 创建hashtable&#xff0c;以N个数本…

【Linux】信号>信号产生信号处理信号保存信号详解

主页&#xff1a;醋溜马桶圈-CSDN博客 专栏&#xff1a;Linux_醋溜马桶圈的博客-CSDN博客 gitee&#xff1a;mnxcc (mnxcc) - Gitee.com 目录 1.信号入门 1.1 生活角度的信号 1.2 技术应用角度的信号 1.3 信号概念 1.4 信号处理常见方式概览 2.产生信号 2.1 通过终端按键…

mac远程桌面连接工具:Microsoft Remote Desktop正式版

Microsoft Remote Desktop 是一款由微软开发的远程桌面控制软件。它允许用户通过互联网连接到远程计算机&#xff0c;从而可以在本地计算机上访问和控制远程计算机的桌面、文件和应用程序。 下载地址&#xff1a;https://www.macz.com/mac/1004.html?idOTI2NjQ5Jl8mMjcuMTg2Lj…

为了性能,放弃tft_eSPI,选择arduino_gfx吧

本来对于tft_espi和arduino_gfx没啥特别的感觉&#xff0c;都是tft屏幕驱动,arduino_gfx的好处就是除了支持tft外还支持一些oled屏幕。 谁知道在探寻我那个在单片机项目上显示中文方案 https://github.com/StarCompute/tftziku 时候&#xff0c;寻求极致性能测了一些东西。 t…

Kiwi浏览器 - 支持 Chrome 扩展的安卓浏览器

​【应用名称】&#xff1a;Kiwi浏览器 - 支持 Chrome 扩展的安卓浏览器 ​【适用平台】&#xff1a;#Android ​【软件标签】&#xff1a;#Kiwi ​【应用版本】&#xff1a;124.0.6327.2 ​【应用大小】&#xff1a;233MB ​【软件说明】&#xff1a;一款基于开源项目 Chr…

每日一题 求和

1.题目解析 求和_牛客题霸_牛客网 (nowcoder.com) 这一题&#xff0c;主要描述的就是求满足和为m的子序列&#xff0c;对与子序列的问题可以使用决策树。 2.思路分析 决策树如下图所示: 递归结束条件&#xff1a; 当当前和 sum 等于目标和 m 时&#xff0c;说明找到了一个满…

软考-下午题-试题二、三

主要是最后一问的不同解答 1、父图子图平衡 1、员工关系是否存在传递依赖&#xff1f;用100字以内的文字说明理由。2019 2、在职员关系模式中&#xff0c;假设每个职员有多名家属成员&#xff0c;那么职员关系模式存在什么问题&#xff1f; 应如何解决&#xff1f;2020 职员关系…

《计算机网络微课堂》1-4 计算机网络的定义和分类

本节课我们介绍计算机网络的定义和分类。 首先来看计算机网络的定义&#xff1a;计算机网络的精确定义并未统一&#xff0c;换句话说&#xff0c;全世界没有一个对计算机网络的公认的唯一定义。 这里我们给出一个计算机网络的最简单定义&#xff0c;即计算机网络是一些互相连接…

技术前沿 |【BLIP:统一理解和生成的自举多模态模型研究】

BLIP&#xff1a;统一理解和生成的自举多模态模型研究 摘要引言一、BLIP模型概述二、 BLIP模型在多模态任务中的应用三、总结 摘要 本文介绍了BLIP&#xff08;Bootstrapping Language-Image Pre-training&#xff09;模型&#xff0c;一个前沿的多模态模型&#xff0c;通过自…

Could not create connection to database server的错误原因

1、使用MyBatis 连接数据库报错 org.apache.ibatis.exceptions.PersistenceException: ### Error updating database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server. ### The error may …

软件工程基础知识

一、软件工程概述 二、软件开发模型 三、软件开发方法 四、需求分析 五、系统设计 六、系统测试 七、软件开发项目管理 八、软件质量 九、软件度量

C#使用开源操作库MiniExcel操作Excel

简介 MiniExcel 简单、高效避免 OOM 的.NET 处理 Excel 查、写、填充数据工具。 目前主流框架大多需要将数据全载入到内存方便操作&#xff0c;但这会导致内存消耗问题&#xff0c;MiniExcel 尝试以 Stream 角度写底层算法逻辑&#xff0c;能让原本 1000 多 MB 占用降低到几 …

Git常用命令的使用

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

Introduction of Internet 计算机网络概述

计算机网络的概念 计算机网络的定义&#xff1a; 多台独立的计算机通过通信线路实现资源共享的计算机系统 计算机网络的组成 资源子网&#xff1a;提供共享的软件资源和硬件资源 通信子网&#xff1a;提供信息交换的网络结点和通信线路 计算机网络类型 按照拓扑排序 星型…

Android 配置本地解决下载 Gradle 慢的问题

步骤1 打开项目下 gradle/wrapper/gradle-wrapper.properties 文件。 步骤2 文件内容如下。 #Sat May 25 16:24:00 CST 2024 distributionBaseGRADLE_USER_HOME distributionPathwrapper/dists distributionUrlhttps\://services.gradle.org/distributions/gradle-8.7-bin…