Leecode刷题——数组——螺旋矩阵

来力扣刷题已经两周了,看了一眼自己的进度,还停留在数组链表,不免内心有点着急。但,总归是知道着急是没有用的,唯有更加努力,才能改变现状,故前言以此作为自我激励,相信自己可以变得更好。

这次总结的是数组矩阵典型问题——螺旋矩阵(力扣题序为:54、59)

1.先来理解一下螺旋矩阵长什么样:如下图

Leecode刷题——数组——螺旋矩阵_第1张图片

显然螺旋矩阵的元素排列方式是螺旋式的,那么在解答之前有一个很重要的知识点需要归纳

  • Java中的二维数组的定义和创建:
int[][] res = new int[n][n]; //定义并初始化了一个二维数组res,数组的大小为n*n

2.若题目需要我们创建一个螺旋矩阵(如题目59),那我们可以首先思考通过模拟法来创建,但是问题的关键在于需要考虑到边界问题,即模拟的上下左右四条边所依据的边界标准(左开右闭或者左闭右开)接下来给出59题的代码如下:

class Solution {
    public int[][] generateMatrix(int n) {
        int[][] res = new int[n][n];
        int left=0,right=n-1,up=0,down=n-1;//定义上下左右四个边界并初始化
        int count=1; //定义计数器操控循环
        while(count<=n*n){
            for(int i=left;i<=right;i++){
                res[up][i]=count++; //可以注意到i<=right为右边闭合
            }
            up++; //下次模拟即左边边界为开
            for(int i=up;i<=down;i++){
                res[i][right]=count++;
            }
            right--;
            for(int i=right;i>=left;i--){
                res[down][i]=count++;
            }
            down--;
            for(int i=down;i>=up;i--){
                res[i][left]=count++;
            }
            left++;
        }
        return res;
    }
}

代码其实很简单,给出的也非常简洁。特别需要注意的是一定要弄清楚模拟过程的四个循环中的二维数组赋值的'i'到底是列还是行。

3.如果题目已经给出矩阵(如题目54),需要螺旋遍历矩阵,其思路也是一样的,可以用模拟法。

但是这里需要获取到二维矩阵的长和宽 

  • 获取矩阵(二维数组)的长和宽:
    int rows = matrix.length, columns = matrix[0].length;

    获得行数好理解,而获得列则里理解为一个行中的元素个数

  • array列表的创建

    List order = new ArrayList();

个人还是觉得模拟法虽然有时候好用,但毕竟只是针对个别题目,而且时间和空间性能并不会特别好,如果一些题目能够做好归纳分类并且整理出好的算法形式会不会更受用一些呢?

你可能感兴趣的:(leetcode,算法,java)