54. 螺旋矩阵
1.题目描述及示例
-
题目描述
给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。 -
示例
2.题解思路及代码
-
思路
(1)按照顺时针方向一圈一圈的处理
(2)我的思路正确,但代码太挫,参考官方写法,像我这种写法边界情况会漏掉很多。 -
代码
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer> order = new ArrayList<Integer>();
if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
return order;
}
int rows = matrix.length, columns = matrix[0].length;
int left = 0, right = columns - 1, top = 0, bottom = rows - 1;
while (left <= right && top <= bottom) {
for (int column = left; column <= right; column++) {
order.add(matrix[top][column]);
}
for (int row = top + 1; row <= bottom; row++) {
order.add(matrix[row][right]);
}
if (left < right && top < bottom) {
for (int column = right - 1; column > left; column--) {
order.add(matrix[bottom][column]);
}
for (int row = bottom; row > top; row--) {
order.add(matrix[row][left]);
}
}
left++;
right--;
top++;
bottom--;
}
return order;
}
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/spiral-matrix/solution/luo-xuan-ju-zhen-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
//我的代码很挫
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer>list=new ArrayList<Integer>();
if (matrix.length==0||matrix==null)
return list;
int length=matrix[0].length;
int height=matrix.length;
int min=Math.min(length,height);
int circle=min/2;
if (min%2!=0)
circle++;
for (int i=0;i<circle;i++)
{
int down=i;
int left=i,right=0;
for (int j=0;j<length;j++)
{
list.add(matrix[i][i+j]);
left=i+j;
}
for (int j=0;j<height-2;j++)
{
list.add(matrix[i+1+j][left]);
down=i+1+j;
}
down++;
if (height>1)//这个if判断,防止重复添加
{
for (int j=0;j<length;j++)
list.add(matrix[down][left-j]);
}
if (length>1)//这个if判断,防止重复添加
{
for (int j=0;j<height-2;j++)
{
list.add(matrix[down-1-j][i]);
}
}
length-=2;
height-=2;
}
return list;
}