目录
一、566. 重塑矩阵
1.模拟
class Solution:
def matrixReshape(self, mat: List[List[int]], r: int, c: int) -> List[List[int]]:
# 模拟
m, n = len(mat), len(mat[0])
if m * n != r * c:
return mat
ans = [[0] * c for _ in range(r)]
ans_x, ans_y = 0, 0
for i, row in enumerate(mat):
for j, x in enumerate(row):
ans[ans_x][ans_y] = x
ans_x, ans_y = (ans_x, ans_y + 1) if ans_y < c - 1 else (ans_x + 1, 0)
return ans
2.二维数组的一维表示
来自官方题解(. - 力扣(LeetCode))。
class Solution:
def matrixReshape(self, mat: List[List[int]], r: int, c: int) -> List[List[int]]:
# 二维数组的一维表示
m, n = len(mat), len(mat[0])
if m * n != r * c:
return mat
ans = [[0] * c for _ in range(r)]
for i in range(m * n):
ans[i // c][i % c] = mat[i // n][i % n]
return ans
3.内置函数
来自题解(. - 力扣(LeetCode))。这里必须要加tolist()(转来转去效率很低)或者改变定义函数时的输出,不然会因为类型不符合而报错。
class Solution:
def matrixReshape(self, mat: List[List[int]], r: int, c: int) -> List[List[int]]:
# 内置函数
m, n = len(mat), len(mat[0])
if m * n != r * c:
return mat
import numpy as np
return np.asarray(mat).reshape((r,c)).tolist()
二、48. 旋转图像
1.辅组矩阵-deepcopy()
主要是要理清,变化后的数组的横纵坐标是怎么由原数组得到的。可以先分为左上、右下、左下、右上来分别举例总结,最后发现是一个规律。
class Solution:
def rotate(self, matrix: List[List[int]]) -> None:
"""
Do not return anything, modify matrix in-place instead.
"""
# 辅组矩阵
m = copy.deepcopy(matrix)
n = len(matrix)
for i in range(n):
for j in range(n):
matrix[j][n - 1 - i] = m[i][j]
2.辅助矩阵2-切片
来自官方题解(. - 力扣(LeetCode))。官方题解给出的找规律的方法值得我们学习。我们将第一行数字进行旋转,发现它们出现在第n - 1列,即可总结到:原数组的第i行元素旋转后会出现在n - 1 - i列。同理,我们将第一列数字进行旋转,发现它们出现在第1行,即可总结到:原数组的第j列元素旋转后会出现在第j行。这个方法即是:我们举特定的一(几)整行或者一(几)整列即可得到行号和列号的变化规律。
class Solution:
def rotate(self, matrix: List[List[int]]) -> None:
"""
Do not return anything, modify matrix in-place instead.
"""
# 辅助矩阵2-切片
n = len(matrix)
m = [[0] * n for _ in range(n)]
for i in range(n):
for j in range(n):
m[j][n - 1 - i] = matrix[i][j]
matrix[:] = m # 这里需要注意
3.原地旋转
来自上面官方题解。妙啊!
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 // 2):
for j in range((n + 1) // 2):
matrix[j][n-1-i], matrix[n-1-i][n-1-j], matrix[n-1-j][i], matrix[i][j] = \
matrix[i][j], matrix[j][n-1-i], matrix[n-1-i][n-1-j], matrix[n-1-j][i]
4.用翻转代替旋转
来自上面官方题解,通过两次翻转,达到和转换公式一样的效果。
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 // 2):
matrix[i], matrix[n - 1 - i] = matrix[n - 1 - i], matrix[i]
for i in range(n):
for j in range(i, n):
matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]
完
感谢你看到这里!一起加油吧!