LeetCode 54 螺旋矩陣

2021-09-13 13:46:33 字數 1836 閱讀 3475

給定乙個包含 m x n 個元素的矩陣(m 行, n 列),請按照順時針螺旋順序,返回矩陣中的所有元素。

示例 1:

輸入:[

[ 1, 2, 3 ],

[ 4, 5, 6 ],

[ 7, 8, 9 ]

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

示例 2:

輸入:[

[1, 2, 3, 4],

[5, 6, 7, 8],

[9,10,11,12]

]輸出: [1,2,3,4,8,12,11,10,9,5,6,7]

這個題目難度並不大,還是很好想的,就跟著螺旋的方式來走。首先從第一行,接著就是最後一列,然後最後一行,最後就是最後一列。思路很清晰,就是座標很容易搞混。

class solution

int n = math.min(matrix.length >> 1,matrix[0].length >> 1);

//判斷行列的大小

if(n == 0)

}return list;

}boolean flag = new boolean[matrix.length][matrix[0].length];

for (int i = 0; i <= n; i++)

return list;

}private void add(arraylistlist, int matrix, int k,boolean flag)

}//加入最後一列

for (int j = k+1; j < matrix.length - k - 1; j++)

}//加入倒數第一行

for (int j = matrix[0].length - 1 - k; j > k; j--)

}//加入第一列

for (int j = matrix.length - k - 1; j > k; j--)

}}}

上面的方法肯定很好理解,但是還會有更好的辦法。我可以從兩個點開始,左上方和右下方的點,然後列印好外層之後可以再向裡面列印。直到最後歸位同一點就行啦

class solution

listres = new arraylist<>();

int h = matrix.length - 1;

int l = matrix[0].length - 1;

int r1 = 0;

int c1 = 0;

int r2 = h;

int c2 = l;

//取坐上的點和右下的點

while (r1 <= r2 && c1 <= c2)

//遍歷整個最外層

return res;

}private listprintitem(int matrix, int r1, int c1, int r2, int c2, listres)

} else if (c1 == c2)

//n=0時

} else

while (r < r2)

while (c > c1)

while (r > r1)

}return res;

}}

第乙個的時間複雜度為o(n),因為空間複雜度很高

第二個的時間複雜度為o(n*m)

這題的難點就是必須要好好的思考這些點的座標位置,然後再慢慢向里推進。不僅可以用遞迴做,也可以的直接暴力迴圈。就看是犧牲空間複雜度還是犧牲時間複雜度啦。

這題目並不太難,畢竟一看到題目之後就大致了解了思路。暴力迴圈是一種選擇,畢竟時間複雜度不高,但是也要考慮到空間的儲存。

[1]

leetcode54 螺旋矩陣

給定乙個包含 m x n 個元素的矩陣 m 行,n 列 請按照順時針螺旋順序,返回矩陣中的所有元素。示例 1 輸入 1,2,3 4,5,6 7,8,9 輸出 1,2,3,6,9,8,7,4,5 示例 2 輸入 1,2,3,4 5,6,7,8 9,10,11,12 輸出 1,2,3,4,8,12,11...

leetcode 54 螺旋矩陣

給定乙個包含 m x n 個元素的矩陣 m 行,n 列 請按照順時針螺旋順序,返回矩陣中的所有元素。示例 1 輸入 1,2,3 4,5,6 7,8,9 輸出 1,2,3,6,9,8,7,4,5 思路是 方向陣列 邊界調整 如下 class solution void matain int x,int...

leetcode 54螺旋矩陣

題目要求 給定乙個矩陣,按螺旋順序輸出各個元素 例子 輸入 1,2,3 4,5,6 7,8,9 輸出 1,2,3,6,9,8,7,4,5 思路 模擬螺旋線路,進行迴圈 每個大迴圈中巢狀四個小迴圈 分別輸出該次迴圈右下左上順序歷遍的元素 即 最外層迴圈中包括 右向迴圈輸出123 下迴圈輸出69 左迴圈...