成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

[Leetcode] Spiral Matrix 螺旋矩陣

waruqi / 3543人閱讀

摘要:代碼添加該圈第一行添加最后一列添加最后一行添加第一列如果是奇數(shù),加上中間那個(gè)點(diǎn)后續(xù)如果在中,給出的是和來代表行數(shù)和列數(shù),該如何解決和的本質(zhì)區(qū)別就是一個(gè)是任意長(zhǎng)方形,一個(gè)是正方形,所以中不需要判斷最后一行或者最后一列。

Spiral Matrix I

Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.

For example, Given the following matrix:

[
 [ 1, 2, 3 ],
 [ 4, 5, 6 ],
 [ 7, 8, 9 ]
]

You should return [1,2,3,6,9,8,7,4,5].

順序添加法 復(fù)雜度

時(shí)間 O(NM) 空間 O(1)

思路

首先考慮最簡(jiǎn)單的情況,如圖我們先找最外面這圈X,這種情況下我們是第一行找前4個(gè),最后一列找前4個(gè),最后一行找后4個(gè),第一列找后4個(gè),這里我們可以發(fā)現(xiàn),第一行和最后一行,第一列和最后一列都是有對(duì)應(yīng)關(guān)系的。即對(duì)i行,其對(duì)應(yīng)行是m - i - 1,對(duì)于第j列,其對(duì)應(yīng)的最后一列是n - j - 1。

XXXXX
XOOOX
XOOOX
XOOOX
XXXXX

然后進(jìn)入到里面那一圈,同樣的順序沒什么問題,然而關(guān)鍵在于下圖這么兩種情況,一圈已經(jīng)沒有四條邊了,所以我們要多帶帶處理,只加那唯一的一行或一列。另外,根據(jù)下圖我們可以發(fā)現(xiàn),圈數(shù)是寬和高中較小的那個(gè),加1再除以2。

OOOOO  OOO
OXXXO  OXO
OOOOO  OXO
       OXO
       OOO
代碼
public class Solution {
    public List spiralOrder(int[][] matrix) {
        List res = new LinkedList();
        if(matrix.length == 0) return res;
        int m = matrix.length, n = matrix[0].length;
        // 計(jì)算圈數(shù)
        int lvl = (Math.min(m, n) + 1) / 2;
        for(int i = 0; i < lvl; i++){
            // 計(jì)算相對(duì)應(yīng)的該圈最后一行
            int lastRow = m - i - 1;
            // 計(jì)算相對(duì)應(yīng)的該圈最后一列
            int lastCol = n - i - 1;
            // 如果該圈第一行就是最后一行,說明只剩下一行
            if(i == lastRow){
                for(int j = i; j <= lastCol; j++){
                    res.add(matrix[i][j]);
                }
            // 如果該圈第一列就是最后一列,說明只剩下一列
            } else if(i == lastCol){
                for(int j = i; j <= lastRow; j++){
                    res.add(matrix[j][i]);
                }
            } else {
                // 第一行
                for(int j = i; j < lastCol; j++){
                    res.add(matrix[i][j]);
                }
                // 最后一列
                for(int j = i; j < lastRow; j++){
                    res.add(matrix[j][lastCol]);
                }
                // 最后一行
                for(int j = lastCol; j > i; j--){
                    res.add(matrix[lastRow][j]);
                }
                // 第一列
                for(int j = lastRow; j > i; j--){
                    res.add(matrix[j][i]);
                }
            }
        }
        return res;
    }
}

2018/2

class Solution:
    def spiralOrder(self, matrix):
        """
        :type matrix: List[List[int]]
        :rtype: List[int]
        """
        if (matrix is None or len(matrix) == 0):
            return []
        rows = len(matrix)
        cols = len(matrix[0])
        level = (min(rows, cols) + 1) // 2
        result = []
        for currLevel in range(0, level):
            firstRow = currLevel
            firstCol = currLevel
            lastRow = rows - currLevel - 1
            lastCol = cols - currLevel - 1
            if firstRow == lastRow:
                for col in range(firstCol, lastCol + 1):
                    result.append(matrix[firstRow][col])
                return result
            if firstCol == lastCol:
                for row in range(firstRow, lastRow + 1):
                    result.append(matrix[row][firstRow])
                return result
            for col in range(firstCol, lastCol):
                result.append(matrix[firstRow][col])
            for row in range(firstRow, lastRow):
                result.append(matrix[row][lastCol])
            for col in range(lastCol, firstCol, -1):
                result.append(matrix[lastRow][col])
            for row in range(lastRow, firstRow, -1):
                result.append(matrix[row][firstCol])
        return result
Spiral Matrix II

Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order.

For example, Given n = 3,

You should return the following matrix:

[
 [ 1, 2, 3 ],
 [ 8, 9, 4 ],
 [ 7, 6, 5 ]
]
順序添加法 復(fù)雜度

時(shí)間 O(NM) 空間 O(1)

思路

本題就是按照螺旋的順序把數(shù)字依次塞進(jìn)去,我們可以維護(hù)上下左右邊界的四個(gè)變量,一圈一圈往里面添加。最后要注意的是,如果n是奇數(shù),要把中心那個(gè)點(diǎn)算上。

代碼
public class Solution {
    public int[][] generateMatrix(int n) {
        int[][] res = new int[n][n];
        int left = 0, right = n - 1, bottom = n - 1, top = 0, num = 1;
        while(left < right && top < bottom){
            // 添加該圈第一行
            for(int i = left; i < right; i++){
                res[top][i] = num++;
            }
            // 添加最后一列
            for(int i = top; i < bottom; i++){
                res[i][right] = num++;
            }
            // 添加最后一行
            for(int i = right; i > left; i--){
                res[bottom][i] = num++;
            }
            // 添加第一列
            for(int i = bottom; i > top; i--){
                res[i][left] = num++;
            }
            top++;
            bottom--;
            left++;
            right--;
        }
        // 如果是奇數(shù),加上中間那個(gè)點(diǎn)
        if(n % 2 == 1){
            res[n / 2][n / 2] = num;
        }
        return res;
    }
}

2018/2

class Solution:
    def generateMatrix(self, n):
        """
        :type n: int
        :rtype: List[List[int]]
        """
        if n == 0:
            return []
        matrix = [[0 for i in range(0, n)] for j in range(0, n)]
        left, right, top, bottom, num = 0, n - 1, 0, n - 1, 1
        while left < right and top < bottom:
            for col in range(left, right):
                matrix[top][col] = num
                num += 1
            for row in range(top, bottom):
                matrix[row][right] = num
                num += 1
            for col in range(right, left, -1):
                matrix[bottom][col] = num
                num += 1
            for row in range(bottom, top, -1):
                matrix[row][left] = num
                num += 1
            left += 1
            right -= 1
            top += 1
            bottom -= 1
        if n % 2 != 0:
            matrix[left][top] = num
        return matrix
后續(xù) Follow Up

如果在matrix ii中,給出的是m和n來代表行數(shù)和列數(shù),該如何解決?

i和ii的本質(zhì)區(qū)別就是一個(gè)是任意長(zhǎng)方形,一個(gè)是正方形,所以ii中不需要判斷最后一行或者最后一列。既然沒有了正方形的前提,那生成矩陣的方法就和i是一樣的了。

class Solution:
    def generateMatrix(self, m, n):
        # m rows, n cols
        if m == 0 or n == 0:
            return []
        matrix = [[0 for i in range(0, n)] for j in range(0, m)]
        num = 1
        level = (min(m, n) + 1) // 2
        for currLevel in range(0, level):
            lastRow = m - currLevel - 1
            lastCol = n - currLevel - 1
            firstRow = currLevel
            firstCol = currLevel
            if firstRow == lastRow:
                for col in range(firstCol, lastCol + 1):
                    matrix[firstRow][col] = num
                    num += 1
                return matrix
            if firstCol == lastCol:
                for row in range(firstRow, lastRow + 1):
                    matrix[row][firstRow] = num
                    num += 1
                return matrix
            for col in range(firstCol, lastCol):
                matrix[firstRow][col] = num
                num += 1
            for row in range(firstRow, lastRow):
                matrix[row][lastCol] = num
                num += 1
            for col in range(lastCol, firstCol, -1):
                matrix[lastRow][col] = num
                num += 1
            for row in range(lastRow, firstRow, -1):
                matrix[row][firstCol] = num
                num += 1
        return matrix

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/64650.html

相關(guān)文章

  • Leetcode 54:Spiral Matrix 螺旋矩陣

    摘要:螺旋矩陣給定一個(gè)包含個(gè)元素的矩陣行列,請(qǐng)按照順時(shí)針螺旋順序,返回矩陣中的所有元素。每次轉(zhuǎn)向或都會(huì)自減。循環(huán)可操作性很高,可以直接操作索引坐標(biāo)改變遍歷方式,不再贅述。 54:Spiral Matrix 螺旋矩陣 Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix i...

    venmos 評(píng)論0 收藏0
  • Leetcode 54:Spiral Matrix 螺旋矩陣

    摘要:螺旋矩陣給定一個(gè)包含個(gè)元素的矩陣行列,請(qǐng)按照順時(shí)針螺旋順序,返回矩陣中的所有元素。每次轉(zhuǎn)向或都會(huì)自減。循環(huán)可操作性很高,可以直接操作索引坐標(biāo)改變遍歷方式,不再贅述。 54:Spiral Matrix 螺旋矩陣 Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix i...

    mochixuan 評(píng)論0 收藏0
  • LeetCode[54] Spiral Matrix

    摘要:復(fù)雜度思路注意循環(huán)條件。代碼注意循環(huán)條件,要用而不是除以,因?yàn)榫葴?zhǔn)換問題只有一行或者一列的時(shí)候,就不要再繼續(xù)搜索了 LeetCode[54] Spiral Matrix Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order. Fo...

    YFan 評(píng)論0 收藏0
  • leetcode59 Spiral Matrix II

    摘要:題目要求也就是將遞加的數(shù)字按照順時(shí)針的順序依次填入數(shù)組之中這道題目聯(lián)系到,其實(shí)就相當(dāng)好解決了。 題目要求 Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order. For example, Given n = 3, You should return...

    QLQ 評(píng)論0 收藏0
  • leetcode54 Spiral Matrix

    摘要:題目要求按照順時(shí)針方向旋轉(zhuǎn)訪問數(shù)組中的元素思路一按行遍歷,轉(zhuǎn)化為因?yàn)椴辉试S跳躍插入,也就是說如果插入的大于的,就會(huì)報(bào)出。思路二利用順序插入為了避免類型轉(zhuǎn)化帶來的不必要的性能下降,最好直接利用順序插入,一次遍歷數(shù)組。 題目要求 Given a matrix of m x n elements (m rows, n columns), return all elements of the ...

    琛h。 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<