Java 打印螺旋顺序矩阵

Java 打印螺旋顺序矩阵,java,arrays,Java,Arrays,给定m*n个元素(m行,n列)的矩阵,按螺旋顺序返回矩阵的所有元素 代码不适用于大输入,事实上我怀疑代码中的last for循环有问题,因为它额外运行了1次 public int[] spiralOrder(final int[][] A) { int m=A.length; int n=A[0].length; int t=0, b=m-1, l=0, r=n-1, dir=0;

给定m*n个元素(m行,n列)的矩阵,按螺旋顺序返回矩阵的所有元素

代码不适用于大输入,事实上我怀疑代码中的last for循环有问题,因为它额外运行了1次

    public int[] spiralOrder(final int[][] A) {
                int m=A.length;
                int n=A[0].length;
                int t=0, b=m-1, l=0, r=n-1, dir=0;
                int[] arr = new int[m*n];
                int p=0;
                while(t<=b && l<=r){

                    if(dir==0){
                        for(int i=l; i<=r ; i++)
                        {
                            arr[p] = A[t][i];
                            p++;
                        }
                        t++;
                        dir = 1;
                    }
                    else if(dir==1){
                        for(int j=t; j<=b; j++)
                        {
                            arr[p] = A[j][r];
                            p++;
                        }
                        dir = 2;
                        r--;
                    }
                    else if(dir==2){
                        if (r<0)break;
                        for(int i=r; i>=l; i--){
                            arr[p]=A[b][i];
                            p++;
                        }
                        dir=3;
                        b--;
                    }
                    else if(dir==3){
                        if (b<0) break;
                        for(int j = b; b>=t; j--){
                            if(j<0)break;
                            else if(j==0 & l==0)break;
                            else{
                                arr[p]=A[j][l];
                                p++;
                            }
                        }
                        dir=0;
                        l++;
                    }
                }
                return arr;
            }
预期结果:

150 6 240 129 168 346 218 168 309 242 26 327 176 274 214 316 97 249 214 387 303 247 125 46 121 91 207 155 267 98 275 315 389 270 2 172 100 151 41 217 200 327 26 279 165 174 291 273 215 8 320 5 324 344 134 122 229 196 225 280

实际结果:

线程“main”java.lang.ArrayIndexOutOfBoundsException:60在Solution.spiralOrder(Solution.java:16)在in.main(main.java:194)中出现异常

原因是您的p持续增长(p++),甚至超过了A的容量

在您的例子中,您试图用一个数字填充[60],但A只到[59],因为它有60个位置,包括[0]

A仅包含mn个位置,因此必须将第一个循环设置为仅在pn时运行

当然,为了避免每次在变量中保存m*n并将p与之比较时都进行计算

if(dir==0){

对于(inti=l;i来说,原因是因为p持续增长(p++),甚至超过了A的容量

在您的例子中,您试图用一个数字填充[60],但A只到[59],因为它有60个位置,包括[0]

A仅包含mn个位置,因此必须将第一个循环设置为仅在pn时运行

当然,为了避免每次在变量中保存m*n并将p与之比较时都进行计算

if(dir==0){

对于(int i=l;i可能您对
=
有问题,因为
=
尝试不使用
阅读此内容,可能您对
=
有问题,因为
=
尝试不使用
阅读此内容
[[150, 6, 240, 129, 168, 346, 218, 168, 309, 242, 26, 327][98, 275, 315, 389, 270, 2, 172, 100, 151, 41, 217, 176][267, 5, 324, 344, 134, 122, 229, 196, 225, 280, 200, 274][155, 320, 8, 215, 273, 291, 174, 165, 279, 26, 327, 214][207, 91, 121, 46, 125, 247, 303, 387, 214, 249, 97, 316]]