LeetCode每日練習(xí)-數(shù)組(48、54、498)

48-旋轉(zhuǎn)圖像

輸入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
輸出:[[7,4,1],[8,5,2],[9,6,3]]

  • 方法:找規(guī)律
class Solution:
    def rotate(self, matrix: List[List[int]]) -> None:
        """
        Do not return anything, modify matrix in-place instead.
        """
        # 要求不使用額外的空間
        # 先上下進(jìn)行 行反轉(zhuǎn) 然后進(jìn)行 對(duì)角線元素反轉(zhuǎn)
        # 1、行反轉(zhuǎn)時(shí),只改變行值,例如: matrix[0][0], matrix[2][0] = matrix[2][0], matrix[0][0]
        row = len(matrix)       # 行數(shù)
        col = len(matrix[0])    # 列數(shù)
        for i in range(row//2):
            for j in range(col):
                matrix[i][j], matrix[row-i-1][j] = matrix[row-i-1][j], matrix[i][j]
        # print(matrix)
         # 2、對(duì)角線反轉(zhuǎn)時(shí),行和列交換,例如: matrix[0][1], matrix[1][0] = matrix[1][0], matrix[0][1]
        for i in range(row):
            # 注意只需要轉(zhuǎn)換一個(gè)下三角或者上三角元素
            for j in range(i):
                matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]
        # print(matrix)
        return matrix
54-螺旋矩陣

輸入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
輸出:[1,2,3,6,9,8,7,4,5]

  • 方法:模擬算法,注意邊界的判斷和處理
class Solution:
    def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
        # 上下左右四個(gè)位置
        up, down, left, right = 0, len(matrix)-1, 0, len(matrix[0])-1
        res = []
        while True:
            # 1、向右走, 遍歷一行
            for i in range(left, right+1):
                res.append(matrix[up][i])
            # 更新行數(shù)
            up += 1 
            if up > down:
                break
            # 2、向下走,遍歷一列
            for i in range(up, down+1):
                res.append(matrix[i][right])
            # 更新列數(shù)
            right -= 1
            if right < left:
                break
            # 3、向左走,遍歷一行
            for i in range(right, left-1, -1):
                res.append(matrix[down][i])
            # 更新行數(shù)
            down -= 1
            if down < up:
                break
            # 4、向上走,遍歷一列
            for i in range(down, up-1, -1):
                res.append(matrix[i][left])
            # 更新列數(shù)
            left += 1
            if left > right:
                break
        return res
498-對(duì)角線遍歷

輸入:mat = [[1,2,3],[4,5,6],[7,8,9]]
輸出:[1,2,4,7,5,3,6,8,9]

  • 方法:找規(guī)律
class Solution:
    def findDiagonalOrder(self, mat: List[List[int]]) -> List[int]:
        row = len(mat)       # 行數(shù)
        col = len(mat[0])    # 列數(shù)
        count = row * col
        x, y = 0, 0
        res = []
        for i in range(count):
            res.append(mat[x][y])
            # 如果行和列的和為 偶數(shù),則遍歷方向?yàn)?右上 ↗
            if (x + y) % 2 == 0:
                # 到了最后一行,向下走
                if y == col - 1:
                    x += 1
                # 到了第一行,向右走
                elif x == 0:
                    y += 1
                # 沿 右上對(duì)角線 遍歷元素
                else:
                    x -= 1
                    y += 1
            # 如果行和列的和為 奇數(shù),則遍歷方向?yàn)?左下 ↙
            else:
                # 到了最后一行,向右走
                if x == row - 1:
                    y += 1
                # 到了第一列,向下走
                elif y == 0:
                    x += 1
                # 沿 左上對(duì)角線 遍歷元素
                else:
                    x += 1
                    y -= 1
        return res
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容