Reshape the Matrix[LeetCode/Python3/Easy]

 

題目

在 MATLAB 中有一個方便的函數叫作 reshape,可以將一個 m x n 的矩陣轉換為一個新的矩陣,大小為 r x c,並保留其原始數據。

給定一个由二维数组表示的矩阵 mat,以及两个正整数 rc,分别表示想要的矩阵的行數和列數。

将矩阵以相同的行遍历顺序重新排列成一个新的矩阵。如果所需大小为给定矩阵大小的子矩阵,则可以进行重塑操作。

如果重新调整大小操作具有合法性,并且可以按照所需大小重塑矩阵,则输出新的重新调整大小后的矩阵;否则,输出原始矩阵。

示例 1:

https://assets.leetcode.com/uploads/2021/04/24/reshape1-grid.jpg

输入:mat = [[1,2],[3,4]], r = 1, c = 4
输出:[[1,2,3,4]]

示例 2:

https://assets.leetcode.com/uploads/2021/04/24/reshape2-grid.jpg

输入:mat = [[1,2],[3,4]], r = 2, c = 4
输出:[[1,2],[3,4]]

提示:

  • m == mat.length
  • n == mat[i].length
  • 1 <= m, n <= 100
  • 1000 <= mat[i][j] <= 1000
  • 1 <= r, c <= 300

我的答案

直覺解答

class Solution:
    def matrixReshape(self, mat: List[List[int]], r: int, c: int) -> List[List[int]]:
        m = len(mat)
        n = len(mat[0])
        if m*n != r*c:
            return mat
        re_mat=[]

        rr=0
        cc=0
        for i in range(m):
            for j in range(n):
                if cc ==0:
                    re_mat.append([mat[i][j]])
                    cc+=1
                elif cc == c:
                    re_mat.append([mat[i][j]])
                    rr+=1
                    cc=1
                else:
                    re_mat[rr].append(mat[i][j])
                    cc+=1
                
        
        return re_mat

修正寫法

其實只有把上述的判斷是直接用數學式去做陣列索引的計算,以及提前先宣告好完整的re_mat的這列格式,但速度並沒有特別快QQ

class Solution:
    def matrixReshape(self, mat: List[List[int]], r: int, c: int) -> List[List[int]]:
        m = len(mat)
        n = len(mat[0])
        if m*n != r*c:
            return mat
        re_mat=[[None for i in range(c)] for i in range(r)]
        for i in range(m*n):
            re_mat[i//c][i%c]=mat[i//n][i%n]
                
        
        return re_mat

 ⚠️ 想特別複習一個點 [[0]*c]*r 這個寫法是把[0]*c複製了r遍,而且是 淺複製 ,所以[0]*C發生變更,則r個都會變更,可以看到以下範例, L=[[0]*2]3 的id位址,每行都是一樣的,但 l=[[0 for i in range(2)] for i in range(3)] 的每行位址都不相同。

l=[[0 for i in range(2)] for i in range(3)]
l
#[[0, 0], [0, 0], [0, 0]]
L=[[0]*2]*3
L
#[[0, 0], [0, 0], [0, 0]]
id(L[0])
#4341325504
id(L[1])
#4341325504
id(L[2])
#4341325504
id(l[0])
#4341309120
id(l[1])
#4341305152
id(l[2])
#4341323328

</aside>


留言

這個網誌中的熱門文章

[理財/記帳]google表單結合iphone捷徑 自製記帳app

[理財/記帳]利用google表單記帳雲端化 - 免費模板下載@ Mimi's learning notes

[Excel]年份週數換算成月份