Python算法题集_螺旋矩阵

news2024/9/17 7:09:04

 Python算法题集_螺旋矩阵

  • 题目54:螺旋矩阵
  • 1. 示例说明
  • 2. 题目解析
    • - 题意分解
    • - 优化思路
    • - 测量工具
  • 3. 代码展开
    • 1) 标准求解【检测4个方向】
    • 2) 改进版一【检测2个方向】
    • 3) 改进版二【可读性改进】
  • 4. 最优算法

题目54:螺旋矩阵

本文为Python算法题集之一的代码示例

1. 示例说明

  • 给你一个 mn 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

    示例 1:

    img

    输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
    输出:[1,2,3,6,9,8,7,4,5]
    

    示例 2:

    img

    输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
    输出:[1,2,3,4,8,12,11,10,9,5,6,7]
    

    提示:

    • m == matrix.length
    • n == matrix[i].length
    • 1 <= m, n <= 10
    • -100 <= matrix[i][j] <= 100

2. 题目解析

- 题意分解

  1. 本题为矩阵寻路算法
  2. 本题的主要计算是元素遍历,算法时间复杂度为O(m*n)
  3. 基本的解法是按当前逐步移动到边界,然后按螺旋转向

- 优化思路

  1. 通常优化:减少循环层次

  2. 通常优化:增加分支,减少计算集

  3. 通常优化:采用内置算法来提升计算速度

  4. 分析题目特点,分析最优解

    1. 此题好像没有什么大的优化空间,主要是减少比较计算的次数

- 测量工具

  • 本地化测试说明:LeetCode网站测试运行时数据波动很大,因此需要本地化测试解决这个问题
  • CheckFuncPerf(本地化函数用时和内存占用测试模块)已上传到CSDN,地址:Python算法题集_检测函数用时和内存占用的模块
  • 本题超时测试用例自行生成,代码详见【4.最优算法】

3. 代码展开

1) 标准求解【检测4个方向】

本题没有太多优化空间,标准代码指标就很高 指标优越,超越95%在这里插入图片描述

import CheckFuncPerf as cfp

def spiralOrder_base(matrix):
 result = []
 if not matrix:
     return result
 iheight, iwidth = len(matrix), len(matrix[0])
 itop, ibottom = 0, iheight - 1
 ileft, iright = 0, iwidth - 1
 while itop <= ibottom and ileft <= iright:
     if itop <= ibottom:
         for iIdx in range(ileft, iright + 1):
             result.append(matrix[itop][iIdx])
         itop += 1
     if ileft <= iright:
         for iIdx in range(itop, ibottom + 1):
             result.append(matrix[iIdx][iright])
         iright -= 1
     if itop <= ibottom:
         for iIdx in range(iright, ileft - 1, -1):
             result.append(matrix[ibottom][iIdx])
         ibottom -= 1
     if ileft <= iright:
         for iIdx in range(ibottom, itop - 1, -1):
             result.append(matrix[iIdx][ileft])
     ileft += 1
 return result

import random, copy
matrix = []
for iIdx in range(1000):
 matrix.append([random.randint(0, 10) for x in range(1000)])
matrixCopy = copy.deepcopy(matrix)
result = cfp.getTimeMemoryStr(spiralOrder_base, matrixCopy)
print(result['msg'])

# 运行结果
函数 spiralOrder_base 的运行时间为 93.02 ms;内存使用量为 8072.00 KB

2) 改进版一【检测2个方向】

经过调试,确认外部边界后,有两个方向可以不进行比较 君临天下,九九归一(99%)在这里插入图片描述

import CheckFuncPerf as cfp

def spiralOrder_ext1(matrix):
 result = []
 if not matrix:
     return result
 iheight, iwidth = len(matrix), len(matrix[0])
 itop, ibuttom, ileft, iright = 0, iheight - 1, 0, iwidth - 1
 while itop <= ibuttom and ileft <= iright:
     for iIdx in range(ileft, iright + 1):
         result.append(matrix[itop][iIdx])
     itop += 1
     for iIdx in range(itop, ibuttom + 1):
         result.append(matrix[iIdx][iright])
     iright -= 1
     if itop <= ibuttom:
         for iIdx in range(iright, ileft - 1, -1):
             result.append(matrix[ibuttom][iIdx])
         ibuttom -= 1
     if ileft <= iright:
         for iIdx in range(ibuttom, itop - 1, -1):
             result.append(matrix[iIdx][ileft])
         ileft += 1
 return result

import random, copy
matrix = []
for iIdx in range(1000):
 matrix.append([random.randint(0, 10) for x in range(1000)])
matrixCopy = copy.deepcopy(matrix)
result = cfp.getTimeMemoryStr(spiralOrder_ext1, matrixCopy)
print(result['msg'])

# 运行结果
函数 spiralOrder_ext1 的运行时间为 91.03 ms;内存使用量为 8484.00 KB

3) 改进版二【可读性改进】

进行可读改进,行列变量更名,块逻辑稍微调整 表现优异,超过98%在这里插入图片描述

import CheckFuncPerf as cfp

def spiralOrder_ext2(matrix):
 result = []
 if not matrix:
     return result
 iheight, iwidth = len(matrix), len(matrix[0])
 ileft, iright, itop, ibottom = 0, iwidth - 1, 0, iheight - 1
 while ileft <= iright and itop <= ibottom:
     for aColno in range(ileft, iright + 1):
         result.append(matrix[itop][aColno])
     for aRowno in range(itop + 1, ibottom + 1):
         result.append(matrix[aRowno][iright])
     if ileft < iright and itop < ibottom:
         for bColno in range(iright - 1, ileft, -1):
             result.append(matrix[ibottom][bColno])
         for bRowno in range(ibottom, itop, -1):
             result.append(matrix[bRowno][ileft])
     ileft += 1
     iright -= 1
     itop += 1
     ibottom -= 1
 return result

import random, copy
matrix = []
for iIdx in range(1000):
 matrix.append([random.randint(0, 10) for x in range(1000)])
matrixCopy = copy.deepcopy(matrix)
result = cfp.getTimeMemoryStr(spiralOrder_ext2, matrixCopy)
print(result['msg'])

# 运行结果
函数 spiralOrder_ext2 的运行时间为 92.03 ms;内存使用量为 7340.00 KB

4. 最优算法

根据本地日志分析,本题算法指标极为接近,最优算法为第2种spiralOrder_ext1

import random, copy
matrix = []
for iIdx in range(1000):
    matrix.append([random.randint(0, 10) for x in range(1000)])
matrixCopy = copy.deepcopy(matrix)

# 算法本地速度实测比较
函数 spiralOrder_base 的运行时间为 93.02 ms;内存使用量为 8072.00 KB
函数 spiralOrder_ext1 的运行时间为 91.03 ms;内存使用量为 8484.00 KB
函数 spiralOrder_ext2 的运行时间为 92.03 ms;内存使用量为 7340.00 KB

一日练,一日功,一日不练十日空

may the odds be ever in your favor ~

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

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

相关文章

《Pandas 简易速速上手小册》第9章:Pandas 数据可视化(2024 最新版)

文章目录 9.1 Pandas 内置可视化工具9.1.1 基础知识9.1.2 重点案例&#xff1a;销售数据分析9.1.3 拓展案例一&#xff1a;产品评价统计9.1.4 拓展案例二&#xff1a;员工满意度分布 9.2 与 Matplotlib 和 Seaborn 集成9.2.1 基础知识9.2.2 重点案例&#xff1a;销售趋势分析9.…

「递归算法」:验证二叉搜索树

一、题目 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。 示例 1&#xff…

vulhub中Apache APISIX 默认密钥漏洞复现(CVE-2020-13945)

Apache APISIX是一个高性能API网关。在用户未指定管理员Token或使用了默认配置文件的情况下&#xff0c;Apache APISIX将使用默认的管理员Token edd1c9f034335f136f87ad84b625c8f1&#xff0c;攻击者利用这个Token可以访问到管理员接口&#xff0c;进而通过script参数来插入任意…

110.乐理基础-五线谱-五线谱的速度

内容参考于&#xff1a;三分钟音乐社 上一个内容&#xff1a;五线谱的附点、休止符、连线、延音线-CSDN博客 上一个内容里练习的答案&#xff1a; 五线谱里的情绪与速度也是跟简谱里一样&#xff0c;详情看&#xff1a;音乐的速度 专栏里的内容&#xff0c;根据创建时间&…

CNN应用Keras Tuner寻找最佳Hidden Layers层数和神经元数量

介绍&#xff1a; Keras Tuner是一种用于优化Keras模型超参数的开源Python库。它允许您通过自动化搜索算法来寻找最佳的超参数组合&#xff0c;以提高模型的性能。Keras Tuner提供了一系列内置的超参数搜索算法&#xff0c;如随机搜索、网格搜索、贝叶斯优化等。它还支持自定义…

《Python 网络爬虫简易速速上手小册》第2章:网络爬虫准备工作(2024 最新版)

文章目录 2.1 选择合适的爬虫工具和库2.1.1 重点基础知识讲解2.1.2 重点案例&#xff1a;使用 Scrapy 抓取电商网站2.1.3 拓展案例 1&#xff1a;使用 Requests 和 BeautifulSoup 抓取博客文章2.1.4 拓展案例 2&#xff1a;使用 Selenium 抓取动态内容 2.2 设置开发环境2.2.1 重…

计算机毕业设计 | vue+SpringBoot图书借阅管理系统(附源码)

1&#xff0c; 概述 1.1 课题背景 随着现在科学技术的进步&#xff0c;人类社会正逐渐走向信息化&#xff0c;图书馆拥有丰富的文献信息资源&#xff0c;是社会系统的重要组成部分&#xff0c;在信息社会中作用越来越重要&#xff0c;在我国图书馆计算机等 信息技术的应用起步…

【Linux】文件重定向与实现支持文件重定向的minishell

目录 0.前提 ​编辑 1.重定向 1.1重定向的本质 1.2dup2 1.3模拟实现输出重定向 > 1.4模拟实现追加重定向 >> 1.5模拟实现输入重定向 < 2.让minishell支持重定向 0.前提 文件描述符的分配规则&#xff1a; 在文件描述符表里面&#xff0c;从小到大按照顺…

linux中的mtime,ctime,atime

目录 结论 文件 touch新文件 调整文件内容 echo直接修改 vi修改 修改文件属性 调整归属 调整权限 读取文件 目录 增加文件 调整目录下文件属性 访问目录下文件 删除文件 结论 mtime&#xff1a;文件内容的修改时间&#xff08;不含权限、属组修改&#xff09; …

计算机网络-封装成帧透明传输(组帧方法)

文章目录 数据链路层功能概述封装成帧透明传输组帧方法字符计数法字符填充法零比特填充法违规编码法 字符填充法为啥复杂和不兼容 数据链路层功能概述 类似老板让小秘书送文件给别的公司&#xff0c;小秘书告诉傻子怎么把该文件送到别的公司的小秘书&#xff0c;然后别的公司的…

基于springboot就业信息管理系统源码和论文

随着信息化时代的到来&#xff0c;管理系统都趋向于智能化、系统化&#xff0c;就业信息管理系统也不例外&#xff0c;但目前国内仍都使用人工管理&#xff0c;市场规模越来越大&#xff0c;同时信息量也越来越庞大&#xff0c;人工管理显然已无法应对时代的变化&#xff0c;而…

挑战杯 python 机器视觉 车牌识别 - opencv 深度学习 机器学习

1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于python 机器视觉 的车牌识别系统 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;3分创新点&#xff1a;3分 &#x1f9ff; 更多资…

【王者荣耀】:背后的技术之谜,揭秘游戏背后的实现奥秘!

目录 1、引言 2、游戏引擎 3、网络技术 4、图形渲染 5、操作控制 6、AI算法 7、数据管理 8、安全防护 9、优化与性能 10、未来发展 11、结语 1、引言 随着智能手机的普及和移动互联网的发展&#xff0c;手机游戏已经成为人们日常娱乐的重要组成部分。而在众多手机游…

Oracle Server一台价值百万的服务器内存更换过程

数据库代码敲多了&#xff0c;看乏了吧&#xff01; 带各位DBA看看你们的数据库运行在什么样的硬件上。 1、故障现象 事发时2号位置报警 登录ILO发现内存报警 查看详细信息 查看详细报警 2、关于ORACLE 服务器DIMM 备用 默认情况下在 Oracle ILOM 中启用 DIMM 备用。由 DIMM 提…

MySQL的原生API实现插入数据后在可视化工具上不显示的问题解决

显示表中有两行数据&#xff0c;该表也设置了主键和唯一索引 点进表里看却没有数据 问题原因出现在这里&#xff0c;虽然很多常用的数据库连接池都会开启自动提交&#xff0c;但ibatis的SqlSession使用sessionFactory.openSession()创建时&#xff0c;默认的自动提交是false&am…

vcruntime140.dll最新的修复方法,一键修复vcruntime140.dll的手段

在这篇文章中&#xff0c;我们将深入探讨并详细介绍各种修复vcruntime140.dll文件缺失或损坏问题的方法。鉴于此类问题广泛存在并影响了众多用户&#xff0c;本文目的是向大家展示不同的修复策略&#xff0c;希望能够帮助每个人解决这些棘手的技术难题。下面一起来看看vcruntim…

02-单例模式 ( Singleton Pattern )

单例模式 单例模式设计要点单例模式基础实现摘要实现范例 单例模式的几种实现方式1. 懒汉式&#xff0c;线程不安全2. 懒汉式&#xff0c;线程安全3. 饿汉式4. 双检锁/双重校验锁&#xff08;DCL&#xff0c;即 double-checked locking&#xff09;5. 登记式/静态内部类6. 枚举…

更新npm镜像源:淘宝镜像已过期,及时切换!

你好&#xff0c;我是小白Coding日志&#xff0c;一个热爱技术的程序员。在这里&#xff0c;我分享自己在编程和技术世界中的学习心得和体会。希望我的文章能够给你带来一些灵感和帮助。欢迎来到我的博客&#xff0c;一起在技术的世界里探索前行吧&#xff01; 前言 就在昨天…

使用PHPStudy搭建Cloudreve网盘服务

文章目录 1、前言2、本地网站搭建2.1 环境使用2.2 支持组件选择2.3 网页安装2.4 测试和使用2.5 问题解决 3、本地网页发布3.1 cpolar云端设置3.2 cpolar本地设置 4、公网访问测试5、结语 1、前言 自云存储概念兴起已经有段时间了&#xff0c;各互联网大厂也纷纷加入战局&#…

【2024.2.4练习】国王游戏

题目描述 题目思路 涉及排列组合求最优解问题&#xff0c;数据大考虑是否满足某种贪心策略。 假设不除以右手的数字&#xff0c;那么获得金币数量最多的显然为最后一个人。左手数字最大的应排在最后一位。在右手有数字的情况下&#xff0c;不妨也尝试从最后一个人开始排。 假…