知识储备--基础算法篇-矩阵

这篇具有很好参考价值的文章主要介绍了知识储备--基础算法篇-矩阵。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

2.矩阵

2.1第54题螺旋矩阵

第一题上来就跪了,看了官方答案感觉不是很好理解,找了一个比较容易理解的。

class Solution(object):
    def spiralOrder(self, matrix):
        """
        :type matrix: List[List[int]]
        :rtype: List[int]
        """
        m = len(matrix)
        n = len(matrix[0])
        result = []
        left = 0
        right = n-1
        top = 0
        bottom = m-1
        nums = m*n
        while nums >= 1:
            i = left
            while i <= right and nums >= 1:
                result.append(matrix[top][i])
                nums = nums - 1
                i = i + 1
            top = top + 1
            i = top
            while i <= bottom and nums >= 1:
                result.append(matrix[i][right])
                nums = nums - 1
                i = i + 1
            right = right - 1

            i = right
            while i >= left and nums >= 1:
                result.append(matrix[bottom][i])
                nums = nums - 1
                i = i - 1
            bottom = bottom - 1

            i = bottom
            while i >= top and nums >= 1:
                result.append(matrix[i][left])
                nums = nums - 1
                i = i - 1
            left = left + 1


        return result
                

知识储备--基础算法篇-矩阵,矩阵,算法,线性代数

还有一个暴力方法,其中有几个知识点,

  • list的[]中有三个参数,用冒号分割
  • list[param1:param2:param3]
  • param1,相当于start_index,可以为空,默认是0
  • param2,相当于end_index,可以为空,默认是list.size
  • param3,步长,默认为1。步长为-1时,返回倒序原序列

技巧:使用zip(*matrix)

代码:这里*解包,zip压缩,zip后变成zip类型,zip会把原有矩阵从第一列开始,把每一列打包成一个元祖,把元祖强转为list达到矩阵转置的效果。

但是实现顺时针旋转效果还需要配合[::-1]使用,先把行调换,第一行与最后一行换,然后再矩阵转置,达到矩阵旋转的效果。

class Solution(object):
    def spiralOrder(self, matrix):
        """
        :type matrix: List[List[int]]
        :rtype: List[int]
        """
        res = []
        while matrix:
            # 删除第一行并返回
            res += matrix.pop(0)
            # 矩阵转置
            matrix = list(zip(*matrix))
            # 行调换,如第一行与最后一行换
            matrix = matrix[::-1]

        return res

知识储备--基础算法篇-矩阵,矩阵,算法,线性代数

2.2第73题-矩阵置零

第二道题还是比较简单的,获得0元素的行列索引,将其存到字典中,如果有重复的就不管,最后遍历字典的key,将指定的行列都置0就行了。

class Solution(object):
    def setZeroes(self, matrix):
        """
        :type matrix: List[List[int]]
        :rtype: None Do not return anything, modify matrix in-place instead.
        """
        m = len(matrix)
        n = len(matrix[0])
        hang = {}
        lie = {}
        for i in range(m):
            for j in range(n):
                if matrix[i][j]==0:
                    if i not in hang:
                        hang[i] = 1
                    if j not in lie:
                        lie[j] = 1
        
        for i in hang:
            for j in range(n):
                matrix[i][j] = 0
        
        for i in lie:
            for j in range(m):
                matrix[j][i] = 0

知识储备--基础算法篇-矩阵,矩阵,算法,线性代数

2.3第48题-旋转图像

给定一个 × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。

你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。

示例 1:

知识储备--基础算法篇-矩阵,矩阵,算法,线性代数

直接用刚学会的矩阵转置来做,飞快,就是内存用的多。

class Solution(object):
    def rotate(self, matrix):
        """
        :type matrix: List[List[int]]
        :rtype: None Do not return anything, modify matrix in-place instead.
        """
        # 直接用转置
        # 先颠倒,再转置
        matrix[:] = matrix[::-1]
        matrix[:] = list(zip(*matrix))

知识储备--基础算法篇-矩阵,矩阵,算法,线性代数

用常规方法,第i行的第x个元素(列)移动到第m-i-1列的第x个位置(行)

class Solution(object):
    def rotate(self, matrix):
        """
        :type matrix: List[List[int]]
        :rtype: None Do not return anything, modify matrix in-place instead.
        """
        matrix2 = copy.deepcopy(matrix)
        m = len(matrix)
        for i in range(m):
            for j in range(m):
                matrix[j][m-1-i] = matrix2[i][j]

知识储备--基础算法篇-矩阵,矩阵,算法,线性代数

2.4第240题搜索二维矩阵

编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:

  • 每行的元素从左到右升序排列。
  • 每列的元素从上到下升序排列。

示例 1:

知识储备--基础算法篇-矩阵,矩阵,算法,线性代数

class Solution(object):
    def searchMatrix(self, matrix, target):
        """
        :type matrix: List[List[int]]
        :type target: int
        :rtype: bool
        """
        # 对角线上的元素是左上角块的最大值,只需要确定target的范围,
        # 找到比target小的对应行列就可以了
        # 比如target=14,先确定范围,>1,>5,>9,<17
        # 这时候就可以在元素17对应的左边和上边遍历寻找了
        # 如果m!=n,则先寻找对角线,再寻找剩下几列
        max_ = []
        m = len(matrix)
        n = len(matrix[0])
        a = min(m,n)
        flag = False
        for i in range(a):
            max_.append(matrix[i][i])
        b = 0
        c = 0
        d = 0
        for i in range(a):
            if target < max_[i]:
                b = i-1
                break
            elif target==max_[i]:
                return True

        for i in range(b+1,n):
            if target < matrix[b][i]:
                c = i
                break
            elif target == matrix[b][i]:
                return True
        for i in range(b+1,m):
            if target < matrix[i][b]:
                d = i
                break
            elif target == matrix[i][b]:
                return True
        for j in range(c,n):
            for i in range(b):
                if matrix[i][j] == target:
                    return True
        
        for j in range(d,m):
            for i in range(b):
                if matrix[j][i] == target:
                    return True

 
        
        

知识储备--基础算法篇-矩阵,矩阵,算法,线性代数

看了答案,发现从右上角慢慢缩小范围就可以了,妈的,这没想到。

class Solution(object):
    def searchMatrix(self, matrix, target):
        """
        :type matrix: List[List[int]]
        :type target: int
        :rtype: bool
        """
        m = len(matrix)
        n = len(matrix[0])
        x = 0
        y = n-1
        while x<m and y>=0:
            if matrix[x][y]==target:
                return True
            elif matrix[x][y] < target:
                x = x + 1
            else:
                y = y - 1

知识储备--基础算法篇-矩阵,矩阵,算法,线性代数文章来源地址https://www.toymoban.com/news/detail-694839.html

到了这里,关于知识储备--基础算法篇-矩阵的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 线性代数的学习和整理2:线性代数的基础知识(整理ing)

    目录 1 写在前面的话 1.1 为什么要先总结一些EXCEL计算矩阵的工具性知识, 而不是一开始就从基础学起呢?  1.2 关于线性代数入门时的各种灵魂发问: 1.3 学习资料 2 什么是线性(关系)? 2.1 线性的到底是一种什么关系: 线性关系=正比例/正相关关系 ≠ 直线型关系 2.2 一次函数

    2024年02月14日
    浏览(53)
  • 线性代数入门:基础知识与实践

    线性代数是数学的一个分支,主要研究的是线性方程组和向量空间等概念。它在现代科学和工程领域中具有广泛的应用,如计算机图形学、机器学习、信号处理、金融等。线性代数的核心内容包括向量、矩阵、线性方程组的求解、向量空间等。在本文中,我们将从线性代数的

    2024年02月22日
    浏览(45)
  • 图解AI数学基础 | 线性代数与矩阵论

    一个标量就是一个单独的数。 只具有数值大小,没有方向 (部分有正负之分),运算遵循一般的代数法则。 一般用小写的变量名称表示。 质量mmm、速率vvv、时间ttt、电阻ρrhoρ 等物理量,都是数据标量。 向量指具有大小和方向的量,形态上看就是一列数。 通常赋予向量

    2024年04月10日
    浏览(37)
  • 线性代数之美:从基础知识到高级技巧

    线性代数是数学的一个分支,它研究的是线性方程组和线性空间等概念。线性代数在许多科学和工程领域都有广泛的应用,例如机器学习、计算机图形学、信号处理等。在这篇文章中,我们将从基础知识到高级技巧来详细讲解线性代数的核心概念、算法原理、具体操作步骤以

    2024年01月20日
    浏览(39)
  • 深度学习基础知识(三)-线性代数的实现

    1.标量使用 标量由只有一个元素的张量表示,标量可以做最简单的计算。 结果: 2.向量使用 向量:将标量值组成的列表就是向量 结果: 访问张量的长度 只有一个轴的张量,形状只有一个元素 创建一个二维矩阵5行4列,然后将矩阵做转置,轴对称的一个转置 结果:其实就是把

    2024年02月10日
    浏览(45)
  • 线性代数(基础篇):第一章:行列式 、第二章:矩阵

    1. A可逆 ⇦⇨①|A|≠0 ⇦⇨②r(A)=n,A满秩 ⇦⇨③A的列向量 α₁,α₂,…α n 线性无关 ⇦⇨④Ax=0仅有零解 (系数矩阵的秩 = 列数,列满秩) ⇦⇨⑤ A的特征值均不为0 【17年5.】 2.  A不可逆 ⇦⇨①|A|=0 ⇦⇨②r(A)n,A不满秩 ⇦⇨③A的列向量 α₁,α₂,…α n 线性相关 ⇦⇨④Ax=0有非

    2024年02月16日
    浏览(39)
  • 轻松掌握线性代数-万字长文基础知识概览

    线性代数是一门将 m 维世界与 n 维世界联系起来的学科 映射:把集合 Y 的元素与集合 X 的元素相对应的规则叫做 “从集合 X 到集合 Y 的映射”。 像:通过映射 f 与 x i 相对应的集合 Y 的元素,叫做 x i 通过映射 f 形成的像,一般表示为 f(x i )。 线性映射的例子 f ( x ) = 2 x f(

    2024年02月11日
    浏览(58)
  • 线性代数的学习和整理1:用EXCEL进行基础的矩阵计算

    目录 1 写在最开始的话 EXCEL里计算线性代数的起点 心得 内容 2 EXCEL里矩形的加法 2.1  矩阵加法的性质 3 EXCEL里矩阵的减法 4 矩阵标量乘法/ 也称 数乘 4.1 矩阵的标量乘法的性质 5 矩阵点乘, 得到:点积/内积 ,使用mmult() 5.1 矩阵点乘规则 5.2  矩阵的乘法不符合交换性,不能交

    2024年03月20日
    浏览(38)
  • 知识储备--基础算法篇-矩阵

    第一题上来就跪了,看了官方答案感觉不是很好理解,找了一个比较容易理解的。 还有一个暴力方法,其中有几个知识点, list的[]中有三个参数,用冒号分割 list[param1:param2:param3] param1,相当于start_index,可以为空,默认是0 param2,相当于end_index,可以为空,默认是list.size p

    2024年02月10日
    浏览(24)
  • 线性代数 --- 计算斐波那契数列第n项的快速算法(矩阵的n次幂)

    The n-th term of Fibonacci Numbers:         斐波那契数列的是一个古老而又经典的数学数列,距今已经有800多年了。关于斐波那契数列的计算方法不难,只是当我们希望快速求出其数列中的第100,乃至第1000项时,有没有又准又快的方法,一直是一个值得探讨和研究的问题。笔者

    2024年04月27日
    浏览(32)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包