题目描述:
给定一个包含 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]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/spiral-matrix
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解法:
class Solution {
List<Integer> list = new ArrayList<>();
public List<Integer> spiralOrder(int[][] matrix) {
if(matrix == null||matrix.length == 0 || matrix[0].length == 0){
return list;
}
int tr = 0;
int tc = 0;
int dr = matrix.length-1;
int dc = matrix[0].length-1;
while (tr<=dr && tc<=dc){
help(matrix,tr++,tc++,dr--,dc--);
}
return list;
}
private void help(int[][] matrix,int tr,int tc,int dr,int dc) {
if(tr == dr){//如果只剩一行了
for (int i = tc; i <= dc; i++) {
list.add(matrix[tr][i]);
}
}else if(tc == dc){//如果只剩一列了
for (int i = tr; i <= dr; i++) {
list.add(matrix[i][tc]);
}
}else {
int cur_r = tr;
int cur_c = tc;
while (cur_c != dc){//列下标加到右边界
list.add(matrix[cur_r][cur_c]);
cur_c++;
}
while (cur_r !=dr){//行下标加到下边界
list.add(matrix[cur_r][cur_c]);
cur_r++;
}
while (cur_c != tc){//列下标减到左边界
list.add(matrix[cur_r][cur_c]);
cur_c--;
}
while (cur_r != tr){//行下标减到上边界
list.add(matrix[cur_r][cur_c]);
cur_r--;
}
}
}
}