力扣 - 劍指 Offer 29. 順時針列印矩陣

linzeliang 發表於 2021-10-20

題目

劍指 Offer 29. 順時針列印矩陣

思路1

  • 其實就是按照理解題目的意思一步步從外層到內層列印出來,同時將一個外層分成四個部分分步列印
  • 可以用一個變數count來維護當前列印的第幾層
  • 判斷列印結束了的條件是:count*2<column && count*2<row
  • 但是要注意的是邊界條件的判斷,可能最裡面的一層不一定要四邊全部都列印出來的情況記得判斷

程式碼

class Solution {
    public int[] spiralOrder(int[][] matrix) {
        if (matrix.length == 0) {
            return new int[0];
        }

        int column = matrix[0].length;
        int row = matrix.length;
        //
        int[] res = new int[column * row];
        // 寫入到res陣列的指標
        int position = 0;
        // 代表的是第幾遍迴圈
        int count = 0;

        while (count*2 < column && count*2 < row) {
            int endColumn = column - 1 - count;
            int endRow = row - 1 - count;

            // 列印上方
            // 只有這個不用判斷,因為是最先列印的這個
            // 如果最內圈只有一行,那麼其他三個方向就都不要列印了,所以其他三個方向要判斷
            for (int i = count; i <= endColumn; i++) {
                res[position++] = matrix[count][i];
            }

            // 列印右側
            if (count < endRow) {
                for (int i = count+1; i <= endRow; i++) {
                    res[position++] = matrix[i][endColumn];
                }
            }

            // 列印下方
            if (count < endColumn && count < endRow) {
                for (int i = endColumn-1; i >= count; i--) {
                    res[position++] = matrix[endRow][i];
                }
            }

            // 列印左側
            if (count < endColumn && count < endRow) {
                for (int i = endRow-1; i > count; i--) {
                    res[position++] = matrix[i][count];
                }
            }

            count++;
        } 

        return res;
    }
}

複雜度分析

  • 時間複雜度:\(O(M*N)\)
  • 空間複雜度:\(O(1)\)