題目:螺旋矩陣
分類:陣列、矩陣、模擬
給你一個 m 行 n 列的矩陣 matrix ,請按照 順時針螺旋順序 ,返回矩陣中的所有元素。
示例 1:
輸入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
輸出:[1,2,3,6,9,8,7,4,5]
示例 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]
提示:
m == matrix.length
n == matrix[i].length
1 <= m, n <= 10
-100 <= matrix[i][j] <= 100
路徑範圍
往右走最大值right
往左走最小值left
往下走最大值bottom
往上走最小值top
【細節】right是列的最大值,bottom是行的最大值
思路
-
起點——向右——到right,right不變,top+1(往下走一行)——向下——到bottom,bottom不變,right-1(向左走一列)——向左——到left,left不變,bottom-1(向上走一行)——向上——到top,top不變,left+1(向右走一行,此時已在第二排第二列了)完成一週
-
繼續螺旋迴圈,直到left>right,top<bottom退出,實則在二者相等時:僅剩一個元素,迴圈這一遍之後結束
【細節】
- 矩陣為空的處理
- 每次走都有兩個條件,eg:即使top現在不變,也要保證top<=bottom的前提,否則會越界
- java中用.length獲取大小,c++中用.size()
/*java*/
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer> output = new ArrayList<>();
//std::vector<int> spiralOrder(std::vector<std::vector<int>>& matrix) {
//std::vector<int> output;
if(matrix==null||matrix.length==0||matrix[0].length==0)
return output;
int left=0;
int top=0;
int bottom=matrix.length-1;
int right=matrix[0].length-1;
int i=0;
while(left<=right && top<=bottom){
for(i=left;i<=right&&top<=bottom;++i){
output.add(matrix[top][i]);
}
top++;
for(i=top;i<=bottom&&left<=right;++i){
output.add(matrix[i][right]);
}
right--;
for(i=right;i>=left&&top<=bottom;--i){
output.add(matrix[bottom][i]);
}
bottom--;
for(i=bottom;i>=top&&left<=right;--i){
output.add(matrix[i][left]);
}
left++;
}
return output;
}
};