【问题标题】:print spiral order matrix打印螺旋阶矩阵
【发布时间】:2019-09-10 15:29:45
【问题描述】:

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

代码不适用于大输入,事实上我怀疑代码中的最后一个 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][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]]

预期结果:

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 at Solution.spiralOrder(Solution.java:16) at in.main(Main.java:194)

【问题讨论】:

标签: java arrays


【解决方案1】:

原因是你的 p 继续增长 (p++) 甚至超过了 A 的容量。

在您的情况下,您尝试用数字填充 A[60],但 A 只到 A[59],因为它有 60 个位置,包括 A[0]。

A 仅包含 mn 个位置,因此您必须使第一个循环仅在 pn 时运行。

当然要避免每次都进行计算,您可以将 m*n 保存在变量中并将 p 与它进行比较。

if(dir==0){
   for(int i=l; i<=r&&p<m*n ; i++)
   {
      arr[p] = A[t][i];
      p++;
   }
   t++;
   dir = 1;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-23
    • 1970-01-01
    • 2022-07-21
    • 1970-01-01
    • 2014-08-10
    • 2020-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多