内圈收缩,遍历当前圈,不规则矩阵需考虑当长或宽已走完时最后的单列或单行或单点的处理
ArrayList<Integer> list = new ArrayList<>();
// 空矩阵
if(matrix.length==0)
return list;
// 确定四个角
int top=0,bottom=matrix.length-1;
int left=0,right=matrix[0].length-1;
// 没走到最右边或最底部时,左右下左上,顺时针取数,往右left自增,往下top自增,往左right自减,往上bottom自减
while (left<right && top<bottom){
for(int i=left;i<right+1;i++)
list.add(matrix[top][i]);
top++;
for(int i=top;i<bottom+1;i++)
list.add(matrix[i][right]);
right--;
for (int i=right;i>left-1;i--)
list.add(matrix[bottom][i]);
bottom--;
for(int i=bottom;i>top-1;i--)
list.add(matrix[i][left]);
left++;
}
// 处理单行
if(left<right && top==bottom){
for (int i=left;i<right+1;i++)
list.add(matrix[top][i]);
}
// 处理单列
if(top<bottom && left==right){
for (int i=top;i<bottom+1;i++)
list.add(matrix[i][right]);
}
// 处理单点
if(top==bottom && left==right)
list.add(matrix[top][left]);
return list;
测试数据
// 空数组
int[][] matrix={};
// 长宽一致数组3=3
int[][] matrix1={{1,2,3},{4,5,6},{7,8,9}};
// 长大于宽数组 4>3
int[][] matrix2={{1,2,3},{4,5,6},{7,8,9},{10,11,12}};
// 长大于宽数组 5>3
int[][] matrix3={{1,2,3},{4,5,6},{7,8,9},{10,11,12},{13,14,15}};
// 长小于宽数组3<4
int[][] matrix4={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
// 长小于宽数组3<5
int[][] matrix5={{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15}};
// 只有2行
int[][] matrix6 ={{1,2,3,4,5,6,7,8,9,10},{11,12,13,14,15,16,17,18,19,20}};
// 只有2列
int[][] matrix7 ={{1,2},{3,4},{5,6},{7,8},{9,10}};
// 一列
int[][] matrix8 ={{1},{2},{3},{4}};
// 一行
int[][] matrix9 ={{1,2,3,4}};
// 一行一列
int[][] matrix10 ={{1}};