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

news2024/12/23 6:01:44

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

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

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

相关文章

采购人员的电子元器件市场洞察力

采购人员在电子元器件市场中需要具备一定的洞察力&#xff0c;以帮助他们做出明智的决策、管理供应链和确保采购的元器件符合要求。以下是一些关于采购人员在电子元器件市场中应具备的洞察力方面的重要考虑因素&#xff1a; 市场趋势分析&#xff1a; 采购人员需要密切关注电子…

FreeRTOS操作系统中,断言输出 Error:..\..\FreeRTOS\portable\RVDS\ARM_CM4F\port.c,766 原因

分析&#xff1a;Error:..\..\FreeRTOS\portable\RVDS\ARM_CM4F\port.c,766 出现这个原因表示&#xff0c;你现在系统某个中断的优先级高于FreeRTOS可管理的优先级范围&#xff0c;一旦你这个中断触发&#xff0c;断言的信息即你串口就会输出这个条语句&#xff08;前提你串口…

Linux CentOS7 awk的反转功能

处理文本文件&#xff0c;经常会遇到反向输出的要求。 可用命令rev对待处理的文件或标准输入快速完成。 可用命令tac对文件快速完成反向查看。 而对行中字符串(单词)可借助其他命令达到反向输出的目标。 我们在文章《Linux CentOS7sed的替换及逆转功能》讨论了sed流编辑器对…

手写Mybatis:第13章-通过注解配置执行SQL语句

文章目录 一、目标&#xff1a;注解配置执行SQL二、设计&#xff1a;注解配置执行SQL三、实现&#xff1a;注解配置执行SQL3.1 工程结构3.2 注解配置执行SQL类图3.3 脚本语言驱动器3.3.1 脚本语言驱动器接口3.3.2 XML语言驱动器 3.4 注解配置构建器3.4.1 定义增删改查注解3.4.2…

Apple Watch 9或使用粘结剂喷射金属3D打印生产表壳

包括路透社在内的众多报道表明&#xff0c;苹果公司目前正在测试用于批量生产Apple Watch Series 9表壳的粘结剂喷射金属3D打印技术&#xff0c;该产品将于9月12日发布。报告称&#xff0c;该生产技术将不再需要将金属部件切割成产品形状&#xff0c;从而减少了产品制造所需的时…

股票交易与先胜而后战

胜在敌败在己&#xff0c;出自《孙子兵法》形篇。 孙子曰&#xff1a;昔之善战者&#xff0c;先为不可胜&#xff0c;以待敌之可胜。不可胜在己&#xff0c;可胜在敌。故善战者&#xff0c;能为不可胜&#xff0c;不能使敌之可胜。故曰&#xff1a;胜可知而不可为。 以前的文章…

接口自动化测试系列-登陆态问题方案

cookie实例 session requests.session()#验证码&#xff0c;我们测试环境用的万能验证码validate_code 1234# 获取登录认证SID#url地址url_login f"http://ops-web-{env}/login.jsp"#获取cookie,并转换成json格式sid requests.get(urlurl_login).cookies.get_dic…

【MySQL】6、MySQL主从复制与读写分离

6.NULL值 select length(null),length(),length(123);null 为空值&#xff0c;但也会占用空间&#xff1b;NULL不会被统计记录不占用空间&#xff0c;但会被统计记录什么是读写分离 读写分离&#xff0c;基本的原理是让主数据库处理事务性增、改、删操作&#xff08;INSERT…

贷款公司如何精准获客,大数据获客

近年来&#xff0c;贷款中介机构在金融服务领域发挥着越来越重要的作用。随着时代的发展&#xff0c;贷款中介机构不仅是贷款服务的提供者&#xff0c;也是能够帮助客户更准确获取客户的服务提供者。 为此&#xff0c;贷款中介机构应把握以下几个方面。 首先&#xff0c;贷款…

自动化与人工智能:‘爱校对’在政府网站巡检中的应用与局限性

在当今数字化时代&#xff0c;自动化和人工智能技术正逐渐渗透到各个领域&#xff0c;政府网站巡检也不例外。"爱校对"等自动化文本校对工具在政府网站巡检中具有许多应用&#xff0c;但同时也存在一些局限性。 应用方面&#xff1a;提高效率&#xff1a; 自动化文本…

Proxifier配置两次代理

proxifier配置两次代理。以前只会配置一次代理&#xff0c;然后在某个环境中&#xff0c;需要进行多级跳转&#xff0c;先登录跳板机A机器&#xff0c;然后从A机器跳转到B机器&#xff0c;网址ip1需要通过机器B的代理访问。 代理方式&#xff1a;配置两下就行了&#xff0c;如…

LeetCode 2511 最多可以摧毁的敌人城堡数目

LeetCode 2511 最多可以摧毁的敌人城堡数目 力扣题目链接&#xff1a;力扣题目链接 给你一个长度为 n &#xff0c;下标从 0 开始的整数数组 forts &#xff0c;表示一些城堡。forts[i] 可以是 -1 &#xff0c;0 或者 1 &#xff0c;其中&#xff1a; -1 表示第 i 个位置 没…

“一个都不能死”在线小游戏源代码

这款名为”一个都不能死”的网页在线小游戏是一款自适应PC和手机的网页游戏。你只需要准备一台服务器或主机&#xff0c;将游戏文件解压并上传到服务器上&#xff0c;就可以开始游戏了。 如果需要进行一些文字内容的修改&#xff0c;你可以在js/main.js文件中进行相应的修改。…

HDFS 集群动态节点管理

目录 一、动态扩容、节点上线 1.1 背景 1.2 扩容步骤 1.2.1 新机器基础环境准备 1.2.2 Hadoop 配置 1.2.3 手动启动 DataNode 进程 1.2.4 Web 页面查看情况 1.2.5 DataNode 负载均衡服务 二、动态缩容、节点下线 2.1 背景 2.2 缩容步骤 2.2.1 添加退役节点 …

dubbo服务管控

我们已经介绍了Dubbo在服务治理方面提供的特性&#xff0c;今天我们一起来看看Dubbo在其它方面提供的特性。同服务治理篇一样&#xff0c;本文的目的在于学会使用Dubbo在服务管控方面提供的特性&#xff0c;依旧不涉及任何实现原理。 工程结构 嗯~~ 是这样的&#xff0c;因为…

python webdriver 测试框架数据驱动json文件驱动的方式

简介&#xff1a; 数据驱动excel驱动方式,就是数据配置在excel里面&#xff0c;主程序调用的时候每次用从excel里取出的数据作为参数&#xff0c;进行操作&#xff0c; 需要掌握的地方是对excel的操作&#xff0c;要灵活的找到目标数据 测试数据.xlsx: 路径-D:\test\0627 E…

设计模式之代理模式与外观模式

目录 代理模式 简介 优缺点 角色职责 实现 运用场景 外观模式 简介 角色职责 优缺点 实现 使用场景 代理模式 简介 由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时&#xff0c;访问对象不适合或者不能直接引用目标对象&#xff0c;代理对象作为…

京东搜索EE链路演进 | 京东云技术团队

导读 搜索系统中容易存在头部效应&#xff0c;中长尾的优质商品较难获得充分的展示机会&#xff0c;如何破除系统的马太效应&#xff0c;提升展示结果的丰富性与多样性&#xff0c;助力中长尾商品成长是电商平台搜索系统的一个重要课题。其中&#xff0c;搜索EE系统在保持排序…

北美电池测试标准解读:UL 1642、UL 2054、UL 2056、UL 2089 测试报告

在日常生活中人们与各类电子产品的交流和互动越来越多&#xff0c;由于电池与人们的接触日益密切&#xff0c;电池的安全性显得格外重要&#xff0c;因此越来越多商家注重保证电池的安全性&#xff0c;避免因电池安全事故带来的人身伤害和品牌名誉损失。特别是亚马逊今年开年来…

无涯教程-JavaScript - DMIN函数

描述 DMIN函数返回列表或数据库中符合您指定条件的列中的最小数字。 语法 DMIN (database, field, criteria)争论 Argument描述Required/Optionaldatabase 组成列表或数据库的单元格范围。 数据库是相关数据的列表,其中相关信息的行是记录,数据的列是字段。列表的第一行包含…