正文
Leetcode刷题之螺旋矩阵
小程序:扫一扫查出行
【扫一扫了解最新限行尾号】
复制小程序
【扫一扫了解最新限行尾号】
复制小程序
矩阵之螺旋矩阵
总体思路:
- 注意遍历顺序 每次遍历一圈时候不要多加元素
Leetcode54螺旋矩阵
- 给你一个
m
行n
列的矩阵matrix
,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
public List<Integer> spiralOrder(int[][] matrix) {
LinkedList<Integer> res=new LinkedList<>(); int num=matrix.length*matrix[0].length;//总元素个数
int top=0;
int bottom=matrix.length-1;
int left=0;
int right=matrix[0].length-1;
int offset=1;//偏移量 while(num>=1){
//从左到右 包括上面全部数据
for(int i=left;i<=right && num>=1;i++){
res.add(matrix[top][i]);
num--;
}
//从上到下 最上面元素不包括
for(int i=top+offset;i<=bottom && num>=1;i++){
res.add(matrix[i][right]);
num--;
}
//从右到左 最右边元素不包括
for(int i=right-offset;i>=left && num>=1;i--){
res.add(matrix[bottom][i]);
num--;
}
//从下到上 最上面和最下面元素不包括
for(int i=bottom-offset;i>=top+offset && num>=1;i--){
res.add(matrix[i][left]);
num--;
}
top++;
bottom--;
left++;
right--;
} return res;
}
我采用的是下面这种循环遍历方式
为了对称 也完全可以采取以下遍历方式
但是采用第二种方式 要对最后一行数组进行单独处理(因为无法进入任何一次之前的循环)
而采用第一种遍历方式的话 最后一行就不需要特殊处理啦
Leetcode59螺旋矩阵二
- 给你一个正整数
n
,生成一个包含1
到n2
所有元素,且元素按顺时针顺序螺旋排列的n x n
正方形矩阵matrix
。
public int[][] generateMatrix(int n) {
int[][] res=new int[n][n]; int num=1;
int target=n*n;
int top=0;
int bottom=n-1;
int left=0;
int right=n-1;
int offset=1;//偏移量 while(num<=target){
//从左到右 包括上面全部数据
for(int i=left;i<=right && num<=target;i++){
res[top][i]=num;
num++;
}
//从上到下 最上面元素不包括
for(int i=top+offset;i<=bottom && num<=target;i++){
res[i][right]=num;
num++;
}
//从右到左 最右边元素不包括
for(int i=right-offset;i>=left && num<=target;i--){
res[bottom][i]=num;
num++;
}
//从下到上 最上面和最下面元素不包括
for(int i=bottom-offset;i>=top+offset && num<=target;i--){
res[i][left]=num;
num++;
}
top++;
bottom--;
left++;
right--;
}
return res;
}
- 方式二 采用上面第二个图的对称方式来遍历
public int[][] generateMatrix(int n) {
int[][] res=new int[n][n]; //循环次数
int loop=n/2; //循环起始位置
int loopx=0;
int loopy=0; //偏移量
int offset=1; //填充数字
int count=1; //开始循环
while(loop>0){
int i=loopx;
int j=loopy; //从左到右
for(;j<loopy+n-offset;j++){
res[i][j]=count++;
} //从上到下
for(;i<loopx+n-offset;i++){
res[i][j]=count++;
} //从右到左
for(;j>loopy;j--){
res[i][j]=count++;
} //从下到少年宫
for(;i>loopx;i--){
res[i][j]=count++;
} //一次循环结束
loop--;
loopx+=1;
loopy+=1;
offset+=2;
} //奇数特殊处理
int mid=n/2;
if(n%2==1){
res[mid][mid]=count++;
} return res;
}