目录
致力于帮助大家理解leetcode
本次我将会以套模板的方式来讲解螺旋矩阵,助小伙伴以后再也不用为螺旋矩阵头疼了
一共三题 带你清晰了解螺旋矩阵系列
题目描述1
给定一个正整数 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
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
示例 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
给你一个 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