0x3f 第24天 黑马web (安了半天程序 )hot100普通数组

1.螺旋矩阵

思路太夸张了

用DIRS = (0,1),(1,0),(0,-1),(-1,0)分别表示右下左上三个方向

i+=DIRSdi0

j+=DIRSdi1

di代表当前的方向di=0时对应的(0,1)i+0,j+1,说明向右走

di = (di+1)%4 右转

核心思路:先构造DIRS元祖,并且想到方向di

从i = 0 j = 0开始遍历

遍历到的做标记

额外引入x,y来做试探,判断是否走到边界,或者重复,这样说明要拐弯了

(如果直接用 i,j 操作,会导致 "移动后发现走不通,再回退" 的冗余逻辑)

i和j的变换逻辑和for循环不同,所以是新颖的赋值

i+=DIRSdi0

j+=DIRSdi1

时间复杂度 mn 空间复杂度 1

复制代码
class Solution:
    def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
        DIRS = (0,1),(1,0),(0,-1),(-1,0)#右下左上
        i=j=di=0
        m,n = len(matrix),len(matrix[0])
        ans = []
        for _ in range(m*n):
            ans.append(matrix[i][j])
            matrix[i][j] = None  #标记表示走过
            x,y = i+DIRS[di][0],j+DIRS[di][1]#试探步7777
            if x<0 or y<0 or x==m or y==n or matrix[x][y] is None:
                di = (di + 1) % 4
            i+=DIRS[di][0]
            j+=DIRS[di][1]
        return ans

2.旋转图像

1.好理解的方法

先按对角线全部交换

然后每一行反转

这是线代的思路

转置+行翻转

n方 1 但是两次循环

复制代码
class Solution:
    def rotate(self, matrix: List[List[int]]) -> None:
        """
        Do not return anything, modify matrix in-place instead.
        """
        n = len(matrix)
        for i in range(n):
            for j in range(i):
                matrix[i][j],matrix[j][i] = matrix[j][i],matrix[i][j]
        for row in matrix:
            row.reverse()

2.四角转换

每个值都转了90°

核心逻辑:分层 + 四角交换

正方形矩阵旋转的本质是「按层旋转」,每层的元素通过「四个角循环交换」完成旋转:

四角的规律

i,j n-1-j,i n-1-i,n-1-j j,n-1-i

j i j

连接 连接 连接

外循环为了兼容奇数 / 偶数边长,即使出现奇数层,+1//2也能保证这层不用交换

内循环//2说实话没懂原理,死记硬背吧

n方 1 但是一次循环

复制代码
class Solution:
    def rotate(self, matrix: List[List[int]]) -> None:
        """
        Do not return anything, modify matrix in-place instead.
        """
        n = len(matrix)
        for i in range((n+1)//2):
            for j in range(n//2):
                matrix[i][j],matrix[n-1-j][i],matrix[n-i-1][n-1-j],matrix[j][n-i-1]\
                =matrix[n-1-j][i],matrix[n-i-1][n-1-j],matrix[j][n-i-1],matrix[i][j]
相关推荐
MoRanzhi12035 小时前
第 3 篇 · 数据清洗与特征工程:从问题判定到特征构建
python·pandas·数据清洗·特征工程·缺失值处理·异常值检测·特征编码
动词ing5 小时前
【题目练习】算法 组合总和||
算法
longlongzihan5 小时前
链表找环:Floyd 判圈算法(LeetCode 141 & 142 )
c++·算法·leetcode·链表
刘科领5 小时前
使用ollama & openweb-ui 本地搭建自己的AI
人工智能·python·ui·ai
专业程序开发源5 小时前
flask家电故障预测系统92491-计算机课程设计/毕业设计
vscode·python·sql·算法·flask·课程设计
夜雪一千5 小时前
Python 生成模拟地址数据:Faker之外的备选库
网络·windows·python
半亩码田5 小时前
C#转Python第4.8篇:正则表达式:Python re 模块 vs C# System.Text.RegularExpressions
python·正则表达式·c#
夜雪一千5 小时前
如何取消PyCharm自动识别test开头文件并进入测试模式
ide·python·pycharm
Logic1015 小时前
C语言/数据结构欧几里得算法题解:长方形切割最大正方形——贪心划分计数
c语言·数据结构·算法·贪心算法·时间复杂度·空间复杂度·欧几里得算法
yi0115 小时前
LeetCode 643. 子数组最大平均数 I|从暴力枚举到滑动窗口
人工智能·笔记·python·算法·leetcode·滑动窗口