[数组]螺旋矩阵

这个东西嘛,主要就是练习思维!我们直接看题目吧!

59. 螺旋矩阵 II

目的就是生成1-n,然后顺时针放到数组当中。
我们来分析一下这题怎么整?

  • 我们其实可以一圈一圈的遍历,通过n / 2来确定圈数
  • 每一圈的话先找到一个起点,然后通过起点来向右边,向下边,向左边,向上边的移动
  • 需要注意的是如果是奇数的话可能会漏个中间数,所以记得补上去

那我们来看看代码把!

class Solution {
    public int[][] generateMatrix(int n) {
        int[][] res = new int[n][n];

        int startX = 0; int startY = 0;// 每一个圈的起点
        int loop = n / 2;// 圈数,n为奇数则需要特殊处理中间值
        int count = 1;// 数组存储的值

        while (loop > 0){
            int i = startX;
            int j = startY;
            // 从左到右
            for (j = startY; j < n - startY - 1; j ++){
                res[startX][j] = count++;
            }

            // 从上到下
            for (i = startX; i < n - startX - 1; i ++){
                res[i][j] = count++;
            }

            // 从右到左
            for (; j > startY; j --){
                res[i][j] = count++;
            }

            // 从下到上
            for (; i > startX; i --){
                res[i][j] = count++;
            }

            startX++;startY++;// 起点+1

            loop --;// 圈数减1
        }

        // 奇数需要处理中间值
        if (n % 2 == 1) {
            int mid = n / 2;
            res[mid][mid] = n * n;
        }

        return res;
    }
}

这个是力扣的中等难度的题目,怎么说朋友们,看完上面的代码,相信大家都应该理解啦!(点个关注跟我一起持续学习把!顺带点个赞,哈哈哈哈!)

那我们来挑战第二题把!
54. 螺旋矩阵
这个题目嘛,乍一看,感觉跟上面的很想,感觉很有信心,TMD,做啦半天也没做出来!其实就是跟上面差不多!
目的就是给一个二维数组,顺时针遍历它就行!这道题目和上面区别就是这个是m*n,上面是n*n!
这道题目有两个思路
思路1:

  • 定义四个方向
  • 计算出二维数组的长度开始遍历
class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> res = new ArrayList<>();
        if (matrix == null && matrix.length == 0 && matrix[0].length == 0){
            return res;
        }

        int rows = matrix.length; int cols = matrix[0].length;
        int left = 0; int right = matrix[0].length - 1; int top = 0; int bottom = matrix.length - 1;

        while (left <= right && top <= bottom) {
            // 从左边到右边
            for (int col = left; col <= right; col ++) {
                res.add(matrix[left][col]); 
            }

            // 从上面到下面
            for (int row = top + 1; row <= bottom; row ++) {
                res.add(matrix[row][right]);
            }

            if (left < right && top < bottom) {
                // 从右边到左边
                for (int col = right - 1; col >= left + 1; col --) {
                    res.add(matrix[bottom][col]);
                }
                // 从下面到上面
                for (int row = bottom; row >= top + 1; row --){
                    res.add(matrix[row][top]);
                }
            }

            left++; right--;
            top++; bottom--;
        }

        return res;
    }
}

思路2:

  • 定义上下左右四个端点left = 0; int right = matrix[0].length - 1; int top = 0; int bottom = matrix.length - 1;
  • 从左到右,从上到下,从右到左,从下到上的遍历

注意看边界!!!!(此图来源于力扣官方题解)
[数组]螺旋矩阵_第1张图片

class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> res = new ArrayList<>();
        if (matrix == null && matrix.length == 0 && matrix[0].length == 0){
            return res;
        }

        int rows = matrix.length; int cols = matrix[0].length;
        int left = 0; int right = matrix[0].length - 1; int top = 0; int bottom = matrix.length - 1;

        while (left <= right && top <= bottom) {
            // 从左边到右边
            for (int col = left; col <= right; col ++) {
                res.add(matrix[left][col]); 
            }

            // 从上面到下面
            for (int row = top + 1; row <= bottom; row ++) {
                res.add(matrix[row][right]);
            }
            // left == right 可能只有一个或者 只有一列,所以只需要从上到下
            // top == bottom 可能只有一个或者 只有一行,所以只需要从左到右边
            if (left < right && top < bottom) {
                // 从右边到左边
                for (int col = right - 1; col >= left + 1; col --) {
                    res.add(matrix[bottom][col]);
                }
                // 从下面到上面
                for (int row = bottom; row >= top + 1; row --){
                    res.add(matrix[row][top]);
                }
            }

            left++; right--;
            top++; bottom--;
        }

        return res;
    }
}

如果有不理解的地方,或者写的拉垮的地方欢迎评论留言!

感谢大家的阅读,我是Alson_Code,一个喜欢把简单问题复杂化,把复杂问题简单化的程序猿! ❤

你可能感兴趣的:(数据结构和算法,矩阵,leetcode,算法)