思路:通过有规律地变化当前值的横纵坐标来进行螺旋打印,在扫描时不断限制横纵坐标的上限和下限,当然得考虑只有一维的情况。PAT上有个螺旋数组的题是用辅助数组(用来标记该数字是否被扫描过)来限制横纵坐标的范围,但是在此题的case上会超时。

 

class Solution {
public:
vector<int> printMatrix(vector<vector<int> > matrix) {
//clock_t start, finish;
//start = clock();
int maxi = matrix[0].size(), maxj = matrix.size();
vector<int> b;
int i, j,mini,minj;
i = 0; j = 0; mini = 0; minj = 0;
while (mini<maxi&&minj<maxj)
{
while(i<maxi) b.push_back(matrix[j][i++]);
i--; j++; maxi--; minj++;
while(j<maxj) b.push_back(matrix[j++][i]);
j--; i--;
while(j>=minj&&i>=mini) b.push_back(matrix[j][i--]); //j>=minj防止只有一排情况反向打印
i++; j--; mini++; maxj--;
while(i<maxi&&j>=minj) b.push_back(matrix[j--][i]); //i<maxi防止只有一列情况反向打印
j++; i++;
}
//finish = clock();
//printf("time: %.0lfms\n", (finish-start)*1000.0 / CLOCKS_PER_SEC);
return b;
}
};