給定乙個包含 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 左迴圈...