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

这篇具有很好参考价值的文章主要介绍了leetcode分类刷题:矩阵顺时针模拟。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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 = 1
        up, down, left, right = 0, n - 1, 0, n - 1  # 起始圈的上下左右边界
        i, j = up, left  # i,j标记矩阵的赋值位置,初始值为左上角坐标
        for _ in range(n // 2):  # 总圈数为 n // 2
            while i == up and j < right:  # 上
                result[i][j] = count
                j += 1
                count += 1
            while i < down and j == right:  # 右
                result[i][j] = count
                i += 1
                count += 1
            while i == down and j > left:  # 下
                result[i][j] = count
                j -= 1
                count += 1
            while i > up and j == left:  # 左
                result[i][j] = count
                i -= 1
                count += 1
            # 更新圈的上下左右边界
            up, down, left, right = up + 1, down - 1, left + 1, right - 1
            i, j = up, left  # i,j标记矩阵的赋值位置,初始值为左上角坐标
        # 当n为奇数,恰好留了一个中心元素待更新
        if n % 2 == 1:
            result[up][left] = count
        return result


if __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):  # 总圈数为 小的行列值除以2
            while i == up and j < right:  # 上
                result.append(matrix[i][j])
                j += 1
            while i < down and j == right:  # 右
                result.append(matrix[i][j])
                i += 1
            while i == down and j > left:  # 下
                result.append(matrix[i][j])
                j -= 1
            while 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:  # 一列,对应的列索引为left
                for k in range(up, down + 1):
                    result.append(matrix[k][left])
            elif up == down and left != right:  # 一行,对应的行索引为up
                for k in range(left, right + 1):
                    result.append(matrix[up][k])
        return result


if __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

到了这里,关于leetcode分类刷题:矩阵顺时针模拟的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java数据结构与算法刷题-----LeetCode378. 有序矩阵中第 K 小的元素

    java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完): https://blog.csdn.net/grd_java/article/details/123063846 解题思路 已知矩阵相对有序,可以用二分搜索,不过和一维数组排序不同,这是二维的 每一行都递增,每一列也是递增,所以每

    2024年01月23日
    浏览(51)
  • java数据结构与算法刷题-----LeetCode1091. 二进制矩阵中的最短路径

    java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完): https://blog.csdn.net/grd_java/article/details/123063846 双分裂蛇:是求二维表中从起点到终点的经典思路(也是求无权图的最短路径问题的经典解法)。创建两条分裂蛇,分别从起点和

    2024年04月26日
    浏览(52)
  • 数据结构学习 jz29 顺时针打印矩阵

    :模拟 简单题做了超过40分钟 调了很久 不好  我自己做的。 xy_t: 记录xy的方向,往右走,往下走,往左走,往上走 t控制方向 isx:         true:轮到x方向动         false:轮到y方向动 n_res m_res:         n_res:还没走过的行数(x方向)         m_res:还没走

    2024年01月17日
    浏览(37)
  • leetcode分类刷题:二分查找(Binary Search)(四、基于值域的数组/矩阵类型)

    基于值域的二分法与基于定义域的题型不同,它的目标是从一“ 特殊排序序列 ”中确定“第k个元素值”,而不像基于定义域的题型是从排序序列中找小于等于特定target值的第一个索引;同时,针对“特殊排序序列”,往往需要 嵌套使用双指针 法进行操作,进一步增加了对

    2024年02月11日
    浏览(61)
  • 【算法 | 模拟No.4】AcWing 756. 蛇形矩阵 & AcWing 40. 顺时针打印矩阵

    个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【AcWing算法提高学习专栏】 🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望对大家有所帮助 🍓希望我们一起努力、成

    2024年01月16日
    浏览(54)
  • 剑指offer(C++)-JZ29:顺时针打印矩阵(算法-模拟)

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 则依次打印出数字 数据范围: 0 = matrix.length = 100 0 = ma

    2024年02月10日
    浏览(43)
  • 【LeetCode-简单】剑指 Offer 29. 顺时针打印矩阵(详解)

    输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。 示例 1: 示例 2: 剑指 Offer 29. 顺时针打印矩阵 - 力扣(LeetCode) 与 力扣54题相同 54. 螺旋矩阵 二维数组顺时针从外往里走 可以想象成:按照 右-》下-》左 -》上 的顺序一直走,走过的地方不要走即可。

    2024年02月09日
    浏览(54)
  • 【LeetCode-中等】剑指 Offer 29. 顺时针打印矩阵(详解)

    输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。 示例 1: 示例 2: 剑指 Offer 29. 顺时针打印矩阵 - 力扣(LeetCode) 与 力扣54题相同 54. 螺旋矩阵 二维数组顺时针从外往里走 可以想象成:按照 右-》下-》左 -》上 的顺序一直走,走过的地方不要走即可。

    2024年02月13日
    浏览(45)
  • Leetcode-每日一题【剑指 Offer 29. 顺时针打印矩阵】

    输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。 示例 1: 输入: matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出: [1,2,3,6,9,8,7,4,5] 示例 2: 输入: 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] 限制: 0 = matrix.length = 100 0 = matrix[i].length = 100 1.题目要求

    2024年02月13日
    浏览(57)
  • 数据结构算法leetcode刷题练习(1)

    给定一个三角形 triangle ,找出自顶向下的最小路径和。 每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。也就是说,如果正位于当前行的下标 i ,那么下一步可以移动到下一行的下标

    2023年04月24日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包