虐杀螺旋矩阵(乱杀leetcode,有彩蛋)

目录

 

题目描述1

思路

题解1

题目描述2

题解2

题目描述3

题解3


致力于帮助大家理解leetcode

本次我将会以套模板的方式来讲解螺旋矩阵,助小伙伴以后再也不用为螺旋矩阵头疼了

一共三题 带你清晰了解螺旋矩阵系列

题目描述1

59. 螺旋矩阵 II

给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。

示例:

输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]

思路

模拟顺时针画矩阵的过程:

  • 填充上行从左到右
  • 填充右列从上到下
  • 填充下行从右到左
  • 填充左列从下到上

由外向内一圈一圈这么画下去。螺旋矩阵

图片来自代码随想录,以及k神

Krahets

jyd

题解1

在题解中我选择了三道题来让大家对螺旋矩阵这种题目熟悉

大致分为三步,大家可以看到我道题目步骤都是差不多的,代码也是万变不离其宗

第一步:定义上下左右边界

第二步:定义循环条件

第三步:定义一个存储结构将结果存储在其中

class Solution {
    public int[][] generateMatrix(int n) {
        int t=0;//上边界
        int b=n-1;//下边界
        int l=0;//左边界
        int r=n-1;//右边界
        int target=n*n;//定义循环条件
        int nums=1;//用来存储结果
        int [][]matrix=new int[n][n];//用来存储记过
        int x=0;//定义循环条件
        while(x<target){
            for(int i=l;i<=r&&x<target;i++){matrix[t][i]=nums++;x++;}
            t++;//缩小边界
            for(int i=t;i<=b&&x<target;i++){matrix[i][r]=nums++;x++;}
            r--;//缩小边界
            for(int i=r;i>=l&&x<target;i--){matrix[b][i]=nums++;x++;}
            b--;//缩小边界
            for(int i=b;i>=t&&x<target;i--){matrix[i][l]=nums++;x++;}
            l++;//缩小边界
        }
        return matrix;
    }
}

题目描述2

剑指 Offer 29. 顺时针打印矩阵
 

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。

示例 1:

输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
示例 2:

输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]

题解2

class Solution {
    public int[] spiralOrder(int[][] matrix) {
        if(matrix.length==0)return new int[0];

        //先定义上下左右四个边界,每次打印完就缩减边界
        int t=0;//上边界
        int b=matrix.length-1;//下边界
        int l=0;//左边界
        int r=matrix[0].length-1;//右边界
        int len=(b+1)*(r+1);//矩阵的大小循环条件
        int[] res=new int[len];//用来接收矩阵
        int x=0;//循环条件
        
        while(x<len){
        for(int i=l;x<len&&i<=r;i++){res[x++]=matrix[t][i];}//从左到右打印
        t++;//上边界打印一波  缩减一波

        for(int i=t;x<len&&i<=b;i++){res[x++]=matrix[i][r];}//从上到下打印
        r--;//右边界打一波    缩减一波

        for(int i=r;x<len&&i>=l;i--){res[x++]=matrix[b][i];}//从右到左打印
        b--;//下边界打印一波  缩减一波

        for(int i=b;x<len&&i>=t;i--){res[x++]=matrix[i][l];}//从下到上打印
        l++;//左边界打印一波  缩减一波        
}
        return res;
        
    }
}

题目描述3

54. 螺旋矩阵
 

给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

示例 1:


输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]

示例 2:


输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]

题解3

class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> list=new ArrayList<>();//定义存储结构
        int t=0;//定义上边界
        int b=matrix.length-1;//定义下边界
        int l=0;//定义左边界
        int r=matrix[0].length-1;//定义右边界
        int x=0;//定义循环条件
        int len=(b+1)*(r+1);//循环条件
        while(x<len){//t<=b&&l<=r这个条件如果是长方形就不行
            for(int i=l;i<=r&&x<len;i++){list.add(matrix[t][i]);x++;}
            t++;
            
            for(int i=t;i<=b&&x<len;i++){list.add(matrix[i][r]);x++;}
            r--;
            
            for(int i=r;i>=l&&x<len;i--){list.add(matrix[b][i]);x++;}
            b--;
            
            for(int i=b;i>=t&&x<len;i--){list.add(matrix[i][l]);x++;}
            l++;
          
        }
        return list;
    }
}

执行用时:1 ms, 在所有 Java 提交中击败了97.52%的用户

内存消耗:39.4 MB, 在所有 Java 提交中击败了95.00%的用户

通过测试用例:27 / 27

经过上面三道题,想必大家应该对螺旋矩阵有了一个清晰的了解

如果觉得有用务必请给一个三连

感谢!!

彩蛋:qq群941088436

评论 37
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值