当前位置: 首页 > news >正文

leetcode分类刷题:矩阵顺时针模拟

1、这种题目是对代码熟练度考察,模拟顺时针建立或访问矩阵,需要注意矩阵是否为方阵
2、具体思路:以圈数为循环条件,每一圈都坚持左闭右开的区间规则;当小的行列值为奇数,最后一圈为一行或一列或一个数字的不完整圈
3、细节:把 起始圈的上下左右边界 和 i,j标记矩阵的赋值位置 放在圈数循环外部,以方便完整圈数遍历完后使用这些变量;同时,圈数循环内部的最后要对这些变量进行更新

59. 螺旋矩阵 II

from typing import List
'''
59. 螺旋矩阵 II
题目描述:给你一个正整数 n ,生成一个包含 1 到 n^2 的所有元素,且元素按顺时针顺序螺旋排列的 n i n 正方形矩阵 matrii 。
示例 1:输入:n = 3输出:[[1,2,3],[8,9,4],[7,6,5]]
题眼:代码熟练度考察,模拟顺时针建立矩阵,注意是方阵,复杂度降低了些
思路:以圈数为循环条件,每一圈都坚持左闭右开的区间规则;当n为奇数,恰好留了一个中心元素待更新
注意把 起始圈的上下左右边界 和 i,j标记矩阵的赋值位置 放在圈数循环外部,以方便圈数遍历完后使用这些变量;同时,圈数循环内部的最后要对这些变量进行更新
'''class Solution:def generatedMatrii(self, n: int) -> List[List[int]]:result = [[0] * n for _ in range(n)]# 以圈数为循环条件,每一圈都坚持左闭右开的区间规则count = 1up, down, left, right = 0, n - 1, 0, n - 1  # 起始圈的上下左右边界i, j = up, left  # i,j标记矩阵的赋值位置,初始值为左上角坐标for _ in range(n // 2):  # 总圈数为 n // 2while i == up and j < right:  # 上result[i][j] = countj += 1count += 1while i < down and j == right:  # 右result[i][j] = counti += 1count += 1while i == down and j > left:  # 下result[i][j] = countj -= 1count += 1while i > up and j == left:  # 左result[i][j] = counti -= 1count += 1# 更新圈的上下左右边界up, down, left, right = up + 1, down - 1, left + 1, right - 1i, j = up, left  # i,j标记矩阵的赋值位置,初始值为左上角坐标# 当n为奇数,恰好留了一个中心元素待更新if n % 2 == 1:result[up][left] = countreturn resultif __name__ == "__main__":obj = Solution()while True:try:n = int(input().strip().split('=')[1])print(obj.generatedMatrii(n))except EOFError:break

54. 螺旋矩阵

from typing import List
'''
54. 螺旋矩阵
题目描述:给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
示例 1:输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,6,9,8,7,4,5]
题眼:代码熟练度考察,模拟顺时针返回矩阵元素,注意不是方阵,有点复杂度
思路:以圈数为循环条件,每一圈都坚持左闭右开的区间规则;当小的行列值为奇数,最后一圈为一行或一列或一个数字的不完整圈
注意把 起始圈的上下左右边界 和 i,j标记矩阵的赋值位置 放在圈数循环外部,以方便圈数遍历完后使用这些变量;同时,圈数循环内部的最后要对这些变量进行更新
'''class Solution:def spiralOrder(self, matrix: List[List[int]]) -> List[int]:m, n = len(matrix), len(matrix[0])result = []# 以圈数为循环条件,每一圈都坚持左闭右开的区间规则up, down, left, right = 0, m - 1, 0, n - 1  # 起始圈的上下左右边界i, j = up, left  # i,j标记矩阵的赋值位置,初始值为左上角坐标for _ in range(min(m, n) // 2):  # 总圈数为 小的行列值除以2while i == up and j < right:  # 上result.append(matrix[i][j])j += 1while i < down and j == right:  # 右result.append(matrix[i][j])i += 1while i == down and j > left:  # 下result.append(matrix[i][j])j -= 1while i > up and j == left:  # 左result.append(matrix[i][j])i -= 1# 更新圈的上下左右边界up, down, left, right = up + 1, down - 1, left + 1, right - 1  # 起始圈的上下左右边界i, j = up, left  # i,j标记矩阵的赋值位置,初始值为左上角坐标# 当小的行列值为奇数,最后一圈为一行或一列或一个数字的不完整圈if min(m, n) % 2 == 1:if up == down and left == right:  # 一个数字result.append(matrix[up][left])elif up != down and left == right:  # 一列,对应的列索引为leftfor k in range(up, down + 1):result.append(matrix[k][left])elif up == down and left != right:  # 一行,对应的行索引为upfor k in range(left, right + 1):result.append(matrix[up][k])return resultif __name__ == "__main__":obj = Solution()while True:try:in_line = input().strip().split('=')matrix = []for row in in_line[1].strip()[1: -1].split(']')[: -1]:matrix.append([int(n) for n in row.split('[')[1].split(',')])print(obj.spiralOrder(matrix))except EOFError:break
http://www.lryc.cn/news/142938.html

相关文章:

  • Java8新特性整理记录
  • 43.227.196.1 RAID技术有什么意义?
  • c++ qt--信号与槽(一) (第三部分)
  • LLM学习《Prompt Engineering for Developer》
  • nginx-获取客户端IP地址
  • Redis 高可用之集群搭建和数据分片
  • 兄弟,王者荣耀的段位排行榜是通过Redis实现的?
  • Linux系统编程--文件编程--打开创建文件
  • http协议与apache
  • 搜索二叉树的算法解析与实例演示
  • 研磨设计模式day13组合模式
  • Linux命令(73)之zip
  • 深入理解Reactor模型的原理与应用
  • 微信小程序开发的投票评选系统设计与实现
  • 【校招VIP】算法考点之堆排
  • 关于yarn安装时报“node“ is incompatible with this module的解决办法
  • 开源利器推荐:美团动态线程池框架的接入分享及效果展示
  • Linux目录结构与文件管理 (02)(四)
  • 对1GHz脉冲多普勒雷达进行快速和慢速处理生成5个移动目标的距离多普勒图研究(Matlab代码实现)
  • uni.uploadFile上传 PHP接收不到
  • 2023年高教社杯 国赛数学建模思路 - 复盘:光照强度计算的优化模型
  • Netty简易聊天室
  • Flutter Cannot run with sound null safety, because the following dependencies
  • 利用改进的遗传算法(种群隔离与个体迁移)mpi并行解决tsp问题
  • 【C++】—— C++11之线程库
  • 前端面试:【性能优化】前端缓存、CDN、懒加载和预加载
  • 民族传统文化分享系统uniapp 微信小程序
  • netty(二):NIO——处理可写事件
  • PHP基本语法解析与应用指南
  • ICS PA1