Day14:顺时针打印矩阵

发布于:2025-03-13 ⋅ 阅读:(13) ⋅ 点赞:(0)

给定一个二维数组 array,请返回「螺旋遍历」该数组的结果。

螺旋遍历:从左上角开始,按照 向右向下向左向上 的顺序 依次 提取元素,然后再进入内部一层重复相同的步骤,直到提取完所有元素。

示例 1:

输入:array = [[1,2,3],[8,9,4],[7,6,5]]
输出:[1,2,3,4,5,6,7,8,9]

示例 2:

输入:array  = [[1,2,3,4],[12,13,14,5],[11,16,15,6],[10,9,8,7]]
输出:[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]

LCR 146. 螺旋遍历二维数组 - 力扣(LeetCode) 

这是一个循环嵌套循环的问题,需要理清楚再写。

class Solution {
    public int[] spiralArray(int[][] array) {
        if (array == null || array.length == 0 || array[0].length == 0) {
            return new int[0]; // 如果数组为空,返回空数组
        }
        int X = array.length;
        int Y = array[0].length;

        int startX = 0;
        int endX = X - 1;
        int startY = 0;
        int endY = Y - 1;

        int[] result = new int[X*Y];
        int index = 0;

        while(startX <= endX && startY <= endY){
            for(int i = startY; i <= endY; i++){
                result[index] = array[startX][i];
                index++;
            }

            startX++;

            for(int j = startX; j <= endX; j++){
                result[index] = array[j][endY];
                index++;
            }

            endY--;

            for(int k = endY; k >= startY; k--){
                result[index] = array[endX][k];
                index++;
            }

            endX--;

            for(int l = endX; l >= startX; l--){
                result[index] = array[l][startY];
                index++;
            }

            startY++;
        }
        return result;
    }
}

这是我第一遍写的代码,数组边界搞懵逼了好几次,这个题目还是需要搞懂数组边界情况。然后这个代码在遇到{[2,3]}这种单列矩阵的时候报错了。

对于单行和单列的矩阵,你第一个循环把第一行或者第一列遍历完,但是后续的三个循环还是会执行,比如{{2,3,4,5}这个单行矩阵,第一个循环结束是2345,然后第二个循环不执行,第三个循环就会从endY = 3 开始遍历如果我们限定数组长度就会生越界。需要在下面的三个循环外面加上判断条件防止重复遍历。改完后代码如下:

class Solution {
    public int[] spiralArray(int[][] array) {
        if (array == null || array.length == 0 || array[0].length == 0) {
            return new int[0]; // 如果数组为空,返回空数组
        }
        int X = array.length;
        int Y = array[0].length;

        int startX = 0;
        int endX = X - 1;
        int startY = 0;
        int endY = Y - 1;

        int[] result = new int[X*Y];
        int index = 0;

        while(startX <= endX && startY <= endY){
            for(int i = startY; i <= endY; i++){
                result[index] = array[startX][i];
                index++;
            }

            startX++;

            for(int j = startX; j <= endX; j++){
                result[index] = array[j][endY];
                index++;
            }

            endY--;

            if(startX <= endX){
                for(int k = endY; k >= startY; k--){
                    result[index] = array[endX][k];
                    index++;
                }
                endX--;
            }

            if(startY <= endY){
                for(int l = endX; l >= startX; l--){
                    result[index] = array[l][startY];
                    index++;
                }
            startY++;}
        }
        return result;
    }
}