Day4,Hot100(21/100)

矩阵

矩阵置零

直接法:先标记哪里需要变为0,在遍历mat把标记处置为0

import numpy as np
class Solution:
    def setZeroes(self, matrix: List[List[int]]) -> None:
        """
        Do not return anything, modify matrix in-place instead.
        """
        def turn(i,j):
            flag[i,:] *= 0
            flag[:,j] *= 0

        flag = np.ones_like(matrix)
        for i in range(len(matrix)):
            for j in range(len(matrix[0])):
                if matrix[i][j] == 0:
                    turn(i,j)

        for i in range(len(matrix)):
            for j in range(len(matrix[0])):
                if flag[i][j] == 0:
                    matrix[i][j] = 0

54. 螺旋矩阵(X)

顺时针螺旋输出矩阵

模拟题:分为四个方向的遍历数组
(1)从左往右——t
(2)从上往下——r
(3)从右往左——b
(4)从下往上——l
(5)没遍历完一个方向,就把对应idx朝中心移动,直到两个对立方向相遇时推出(如 t > b)
图解

class Solution:
    def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
        if not matrix:
            return []
        m = len(matrix)
        n = len(matrix[0])
        t, r, l, b = 0, n-1, 0, m-1
        res = []
        while True:
            for i in range(l, r + 1): res.append(matrix[t][i]) 
            t += 1
            if t > b: break

            for i in range(t, b + 1): res.append(matrix[i][r])
            r -= 1
            if l > r: break

            for i in range(r, l - 1, -1): res.append(matrix[b][i])
            b -= 1
            if t > b: break

            for i in range(b, t - 1, -1): res.append(matrix[i][l]) 
            l += 1
            if l > r: break
        return res

48. 旋转图像(X)

方法一:使用辅助矩阵。旋转后,第一行–>最后一列,第二行–>倒数第二列……
根据公式:m[i][j] = m[j][n-1-i]

import numpy as np
class Solution:
    def rotate(self, matrix: List[List[int]]) -> None:
        back_up = np.zeros_like(matrix)
        n = len(matrix)
        for i in range(n):
            for j in range(n):
                back_up[j][n-1-i] = matrix[i][j]
        
        for i in range(n):
            for j in range(n):
                matrix[i][j] = int(back_up[i][j])

方法二:原地操作,使用单个辅助元素。
在这里插入图片描述
在这里插入图片描述

class Solution:
    def rotate(self, matrix: List[List[int]]) -> None:
        n = len(matrix)
        for i in range(n // 2):
            for j in range((n + 1) // 2):
                tmp = matrix[i][j]
                matrix[i][j] = matrix[n - 1 - j][i]
                matrix[n - 1 - j][i] = matrix[n - 1 - i][n - 1 - j]
                matrix[n - 1 - i][n - 1 - j] = matrix[j][n - 1 - i]
                matrix[j][n - 1 - i] = tmp

240. 搜索二维矩阵 II

方法一:二分查找每一行,O(mlog2n) 二分模板

class Solution:
    def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
        m = len(matrix)
        n = len(matrix[0])

        for i in range(m):
            l, r = 0, n-1
            while l < r:
                mid = l+r+1 >> 1
                if matrix[i][mid] <= target:
                    l = mid
                else:
                    r = mid - 1
            if matrix[i][l] == target:
                return True
        return False

方法二排除法
(1)每次将target与当前矩阵的右上角m[i][j]相比,逐步的把矩阵从右上角缩小到左下角
(2)如果m[i][j]<target,则当前行不可能存在target,删除该行
(3)如果m[i][j]>target,则当前列不能存在target,删除列

class Solution:
    def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
        m = len(matrix)
        n = len(matrix[0])

        i, j = 0, n-1

        while i < m and j >= 0:
            if matrix[i][j] == target:
                return True
            elif matrix[i][j] < target:
                i += 1
            else:
                j -= 1
        return False
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值