题目描述
给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
示例
提交的代码
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
//行数
int m=matrix.length;
//列数
int n=matrix[0].length;
//以行数和列数中的较小值除以2来确定需要转几次
int minOne=Math.min(m,n);
int loop=minOne/2;
//每一圈的起始index
int startIndex=0;
//每一圈不需要处理的个数
int offset=1;
//定义结果List
List<Integer> result=new ArrayList<Integer>(m*n);
int i,j;
//当前需要循环次数的备份
int loopCopy=loop;
while(loop>0){
i=startIndex;
j=startIndex;
for(;j<n-offset;j++){
result.add(matrix[i][j]);
}
for(;i<m-offset;i++){
result.add(matrix[i][j]);
}
for(;j>=offset;j--){
result.add(matrix[i][j]);
}
for(;i>=offset;i--){
result.add(matrix[i][j]);
}
startIndex++;
loop--;
offset++;
}
//当minOne为偶数的时候,代表当前已经循环完毕,不存在剩余部分
if(minOne%2==0){
return result;
}
//当minOne为奇数的时候,代表还存在1*1,1*3,3*1这样的剩余部分
int remainM=m-loopCopy*2;
int remainN=n-loopCopy*2;
if(remainM==remainN){
//1*1形式的剩余部分
result.add(matrix[startIndex][startIndex]);
}else if(remainM>remainN){
int indexM=startIndex;
int indexN=startIndex;
//m*1形式
for(int y=0;y<remainM;y++,indexM++){
result.add(matrix[indexM][indexN]);
}
}else{
int indexM=startIndex;
int indexN=startIndex;
//1*n形式
for(int y=0;y<remainN;y++,indexN++){
result.add(matrix[indexM][indexN]);
}
}
return result;
}
}
思路
这个题的做法和螺旋矩阵Ⅱ的思想类似,最关键的还是遍历一个二维矩阵使用左闭右开的原则,唯一不同的是计算循环次数loop是根据当前矩阵长和宽相对较短的那一个来计算:int minOne=Math.min(matrix.length,matrix[0].length),loop=minOne/2;最后无法转圈的部分的起始startIndex=minOne/2,然后计算最终剩下的部分的形状矩阵循环遍历就可以解决。
标签:LeetCode54,matrix,螺旋,int,矩阵,startIndex,minOne,loop
From: https://www.cnblogs.com/whitePuPigeon/p/17766593.html