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]

示例 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]

思路:大神们还是很牛的,直接看了大神的代码。这个题主要是搞清楚坐标的转换。首先先确定螺旋的圈数,然后按照上面,右面,下面,左面的顺序依次处理数据。要特别注意范围。

这道题剑指29题,思路比较麻烦,把代码写在下面代码二。这个题太容易写错了。。。。。

代码:

public class Solution {

    public List spiralOrder(int[][] matrix) {
        List result = new ArrayList<>(50);  //存放最后的结果

        if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
            return result;     //矩阵为空
        }

        // 只有一行的情况 要特别注意,对矩阵求length结果返回的是行数
        if (matrix.length == 1) {
            for (int i : matrix[0]) {
                result.add(i);
            }

            return result;
        }

        // 只有一列的情况  返回列数
        if (matrix[0].length == 1) {
            for (int i = 0; i < matrix.length; i++) {
                result.add(matrix[i][0]);
            }

            return result;
        }

        // 计算有多少圈
        int row = matrix.length;
        int col = matrix[0].length;
        int cycle = row < col ? row : col;  //取行列中最小的一个
        cycle = (cycle + 1) / 2;

        int round = 0; // 记录当前是第几圈
        int left = 0;  //第一列
        int right = matrix[0].length - 1;  //最后一列
        int top = 0;  //第一行
        int down = matrix.length - 1;  //最后一行
        int total = col*row;
        int count = 0;
        while (round < cycle) {

            // 上面一行
            for (int i = left; i <= right && count < total; i++) {
                count++;
                result.add(matrix[round][i]);
            }
            top++; //处理下一行

            // 右边一列
            for (int i = top; i <= down && count < total; i++) {
                count++;
                result.add(matrix[i][col - round - 1]);
            }
            right--;

            // 底下一行
            for (int i = right; i >= left && count < total; i--) {
                count++;
                result.add(matrix[row - round - 1][i]);

            }
            down--;

            // 左边一列
            for (int i = down; i >= top && count < total; i--) {
                count++;
                result.add(matrix[i][round]);
            }
            left++;

            round++;
        }

        return result;
    }
}

 

代码二:

public ArrayList printMatrix(int[][] matrix) {
ArrayList list = new ArrayList<>();
if(matrix == null)
return list;
int start = 0;
while(matrix[0].length > start*2 && matrix.length > start*2) {  //这一部分主要是在考虑要打印几圈。以对角线上的元素为标志
printOneCircle(matrix,start,list);
start++;
}
return list;
}
private void printOneCircle(int[][] matrix,int start,        ) {
int endX = matrix[0].length - 1 - start; // 列 需要打印的最大列数
int endY = matrix.length - 1 - start; // 行  需要打印的最大行数
// 从左往右
for (int i = start; i <= endX; i++)
list.add(matrix[start][i]);
// 从上往下
if (start < endY) {
for (int i = start + 1; i <= endY; i++)
list.add(matrix[i][endX]);
}
// 从右往左(判断是否会重复打印)
if (start < endX && start < endY) {
for (int i = endX - 1; i >= start; i--)
list.add(matrix[endY][i]);

}
// 从下往上(判断是否会重复打印)
if (start < endX && start < endY - 1) {
for (int i = endY - 1; i >= start + 1; i--)
list.add(matrix[i][start]);
}
}

 

 

你可能感兴趣的:(LeetCode笔记)