题目链接
题意
给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。
示例 1:
输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出: [1,2,3,6,9,8,7,4,5]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/spiral-matrix
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路(方法二)(思路较优)
- 记录矩阵当前上下左右边界,并维护。
- 步骤:放入矩阵第一行,更新矩阵上边界,判断若上边界>下边界则完成矩阵遍历;放入矩阵最后一列...
代码(方法二)
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer> ansList = new ArrayList<>();
if (matrix == null || matrix.length == 0) {
return ansList;
}
// 定义上下左右边界
int l = 0;
int up = 0;
int r = matrix[0].length - 1;
int down = matrix.length - 1;
while (true) {
// 第一行
for (int i = l; i <= r; ++i) {
ansList.add(matrix[up][i]);
}
if (++up > down) {
break;
}
// 最后一列
for (int i = up; i <= down; ++i) {
ansList.add(matrix[i][r]);
}
if (--r < l) {
break;
}
// 最后一行
for (int i = r; i >= l; --i) {
ansList.add(matrix[down][i]);
}
if (--down < up) {
break;
}
// 第一列
for (int i = down; i >= up; --i) {
ansList.add(matrix[i][l]);
}
if (++l > r) {
break;
}
}
return ansList;
}
}
解题思路(方法一)
用子矩阵的左上角和右下角代表子矩阵,循环打印子矩阵,打印子矩阵的最外圈。
循环最外圈时,先判子矩阵只剩一行/一列的情况。
代码(方法一)
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> printMatrix(int [][] matrix) {
int lR=0;
int lC=0;
int rR=matrix.length-1;
int rC=matrix[0].length-1;
int size=matrix.length*matrix[0].length;
ArrayList<Integer> circleAL=new ArrayList<Integer>(size);//
while(lR<=rR&&lC<=rC){
printCircle(matrix,lR++,lC++,rR--,rC--,circleAL);//
}
return circleAL;
}
private void printCircle(int[][] matrix,int lR,int lC,int rR,int rC,ArrayList<Integer> circleAL){
if(lR==rR){
for(int j=lC;j<=rC;++j){
circleAL.add(matrix[lR][j]);//
}
}
else if(lC==rC){
for(int i=lR;i<=rR;++i){
circleAL.add(matrix[i][lC]);
}
}
else{
int i=lR;
int j=lC;
while(j!=rC){
circleAL.add(matrix[i][j]);
++j;
}
while(i!=rR){
circleAL.add(matrix[i][j]);
++i;
}
while(j!=lC){
circleAL.add(matrix[i][j]);
--j;
}
while(i!=lR){
circleAL.add(matrix[i][j]);
--i;
}
}
}
}