螺旋矩阵之笨人笨解

题目要求

给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。
输入:
[
 [ 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]

献上我的代码:

    public static List<Integer> spiralOrder(int[][] matrix) {

List<Integer> list = new LinkedList<>();
        if(matrix.length == 0) return list;
        int circle = matrix.length > matrix[0].length ? matrix[0].length/2+matrix[0].length%2:matrix.length/2+matrix.length%2; ;
        for (int i = 0; i < circle; i++) {
            if (matrix[0].length - 2 * i == 1) {
                for (int s = i; s < matrix.length - i; s++) {
                    list.add(matrix[s][i]);
                }
                return list;
            } else if(matrix.length - 2*i == 1) {
                for (int s= i; s< matrix[0].length -i; s++) {
                    list.add(matrix[i][s]);
                }
                return list;
            }
                else {
                for (int s = i; s < matrix[i].length - i; s++) {
                    list.add(matrix[i][s]);
                }
                for (int s = i + 1; s < matrix.length - i - 1; s++) {
                    if (matrix[s].length - 1 - i > 0) {
                        list.add(matrix[s][matrix[s].length - 1 - i]);
                    }

                }
                for (int s = matrix[0].length - 1 - i; s >= i; s--) {
                    list.add(matrix[matrix.length - i - 1][s]);
                }


                for (int s = matrix.length - i - 1-1; s >= i+1; s--) {
                    list.add(matrix[s][i]);
                }
            }

        }
        return list;
    }

解答思路:
1.从最完整的一个圈开始,我把一个圈分为 上、右、下、左,并依次添加

[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]
]
第一步添加1,2,3,4 第二步添加8,第三部添加12,11,10,9,第四部添加5
这样就是其中一圈的所有值了。
2.我该循环添加几圈,
起初我认为是matrix.length/2 + matrix.length%2,
这个值的理由是我每一圈的添加都是包含最上和最下2个数组,所以为了不重复添加需要matrix.length/2 ,
而+matrix.length%2是考虑到总长为单数的情况;
最后考虑矩阵长宽不等的情况更改为最短一边的length/2+length%2;

上面这个两部已经满足一些比较常规的数据了,下面考虑一些非常规的,来继续完善我们的计算;
1> [{1,2,3}]
这个条数据 他只有一行且只有一列,他也可以包含在其他数据中,比如
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]
] 这个中的 6,7。可以肯定的是 类似这种数据不需要按一圈来计算,只需要按线来计算,并且他只会出现在最后一圈。
所以针对这条数据单独添加。
2>{{1},{2},{3},{4}}
[
[1,2,3]
[4,5,6]
[7,8,9]
[10,11,12]
[13,14,15]
]
这条数据与上面的那条有异曲同工之妙,上面的为横线计算,这条数据为竖线计算,相同的是他也只会出现在最后一圈。
所以针对这条数据单独添加。

最后感谢您的观看,欢迎您能与我共同探讨,同时感谢自己的坚持,因为在计算的时候我也头脑发涨到想放弃–。

猜你喜欢

转载自blog.csdn.net/weixin_44656996/article/details/87932926