前言說明
算法學(xué)習(xí),日常刷題記錄。
題目連接
題目內(nèi)容
給你一個m行n列的矩陣matrix,請按照順時針螺旋順序,返回矩陣中的所有元素。
示例1:
輸入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
輸出:[1,2,3,6,9,8,7,4,5]
矩陣1
示例2:
輸入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
輸出:[1,2,3,4,8,12,11,10,9,5,6,7]
矩陣2
提示:
m == matrix.length
n == matrix[i].length
1 <= m, n <= 10
-100 <= matrix[i][j] <= 100
分析過程
第一步
定義列表list,保存返回的所有元素。
第二步
定義上指標(biāo)top,初始為0。
定義下指標(biāo)bottom,初始為行數(shù)減1。
定義左指標(biāo)left,初始為0。
定義右指標(biāo)right,初始為列數(shù)減1。
第三步
循環(huán),順時針螺旋也就是向右、向下、向左、向上移動,依次遍歷,直到?jīng)]有元素遍歷為止。
第四步
1、向右移動,行不變,列從左到右。
向右移動后,因為接下來要向下移動,所以上指標(biāo)top加1,如果上指標(biāo)top大于下指標(biāo)bottom,結(jié)束循環(huán)。
2、向下移動,列不變,行從上到下。
向下移動后,因為接下來要向左移動,所以右指標(biāo)right減1,如果右指標(biāo)right小于左指標(biāo)left,結(jié)束循環(huán)。
3、向左移動,行不變,列從右到左。
向左移動后,因為接下來要向上移動,所以下指標(biāo)bottom減1,如果下指標(biāo)bottom小于上指標(biāo)top,結(jié)束循環(huán)。
4、向上移動,列不變,行從下到上。
向上移動后,因為接下來要向右移動,所以左指標(biāo)left加1,如果左指標(biāo)left大于右指標(biāo)right,結(jié)束循環(huán)。
第五步
結(jié)束循環(huán)后,返回列表list。
解答代碼
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
// 定義列表list,保存返回的所有元素
List<Integer> list = new ArrayList<>();
// 定義上指標(biāo),初始為0
int top = 0;
// 定義下指標(biāo),初始為行數(shù)減1
int bottom = matrix.length - 1;
// 定義左指標(biāo),初始為0
int left = 0;
// 定義右指標(biāo),初始為列數(shù)減1
int right = matrix[0].length - 1;
// 循環(huán),順時針螺旋也就是向右、向下、向左、向上,依次遍歷,直到?jīng)]有元素遍歷為止
while (true) {
// 向右移動,行不變,列從左到右
for (int i = left; i <= right; ++i) {
list.add(matrix[top][i]);
}
// 向右移動后,因為接下來要向下移動,所以上指標(biāo)加1,如果上指標(biāo)大于下指標(biāo),結(jié)束循環(huán)
if (++top > bottom) {
break;
}
// 向下移動,列不變,行從上到下
for (int i = top; i <= bottom; ++i) {
list.add(matrix[i][right]);
}
// 向下移動后,因為接下來要向左移動,所以右指標(biāo)減1,如果右指標(biāo)小于左指標(biāo),結(jié)束循環(huán)
if (--right < left) {
break;
}
// 向左移動,行不變,列從右到左
for (int i = right; i >= left; --i) {
list.add(matrix[bottom][i]);
}
// 向左移動后,因為接下來要向上移動,所以下指標(biāo)減1,如果下指標(biāo)小于上指標(biāo),結(jié)束循環(huán)
if (--bottom < top) {
break;
}
// 向上移動,列不變,行從下到上
for (int i = bottom; i >= top; --i) {
list.add(matrix[i][left]);
}
// 向上移動后,因為接下來要向右移動,所以左指標(biāo)加1,如果左指標(biāo)大于右指標(biāo),結(jié)束循環(huán)
if (++left > right) {
break;
}
}
// 返回列表list
return list;
}
}
提交結(jié)果
執(zhí)行用時0ms,時間擊敗100.00%的用戶,內(nèi)存消耗36.5MB,空間擊敗72.30%的用戶。

原文鏈接
原文鏈接:螺旋矩陣

