題目
劍指 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)\)