- 首先想到的依然是递归去处理,遍历完一圈之后,内层又是一个新的矩阵,但是要判断这个矩阵的可能性,到这里真的感觉数据结构算法和离散数学的紧密结合,都要考虑完善,都可以用判断循环递归去解决问题。最开始遗漏掉只有一行或则一列的情况,后面都补齐了,还有内层递归矩阵的初始化也要考虑长度大于2才行。
/*
* 顺时针打印指针
*/
public ArrayList<Integer> printMatrix(int[][] matrix)
{
/*
* 打印外围一圈然后再递归
* 关键在于找到递归出口
*/
//初始化集合列表
ArrayList<Integer> list = new ArrayList<Integer>();
if(matrix.length == 1)//只有一行
{
for(int j = 0;j < matrix[0].length;j ++)
{
list.add(matrix[0][j]);
}
}
else if(matrix[0].length == 1)//只有一列
{
for(int i = 0;i < matrix.length;i ++)
{
list.add(matrix[i][0]);
}
}
else
{
//累计一圈的个数
int count = 0;
//第一行
for(int i = 0;i < matrix[0].length;i ++)
{
list.add(matrix[0][i]);
count ++;
}
//最后一列
for(int j = 1;j < matrix.length;j ++)
{
list.add(matrix[j][matrix[0].length - 1]);
count ++;
}
//最后一行
for(int i = matrix[0].length - 2;i >= 1;i --)
{
list.add(matrix[matrix.length - 1][i]);
}
//第一列
for(int j = matrix.length - 1;j >= 1;j --)
{
list.add(matrix[j][0]);
count ++;
}
//如果最小为4
if(count == 4)
{
return list;
}
else
{
//递归解决
if(matrix.length - 2 >= 1&&matrix[0].length - 2 >= 1)
{
//构建递归矩阵
int[][] matrix2 = new int[matrix.length - 2][matrix[0].length - 2];
for(int i = 0;i < matrix2.length;i ++)
{
for(int j = 0;j < matrix2[0].length;j ++)
{
matrix2[i][j] = matrix[i + 1][j + 1];
}
}
ArrayList<Integer> list2 = new ArrayList<Integer>();
//递归获得内层list2
list2 = printMatrix(matrix2);
//加到外层list
for(Integer i : list2)
{
list.add(i);
}
}
}
}
return list;
}