题目:
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.
链接:
思路:
1、定位当前需要打印圈的起始点,考虑行和列不同,奇偶情况,代码中有注释
2、打印起始点开始的行
3、打印当前圈的最后一列,不包括首尾
4、打印最后一行(倒序)
5、打印当前圈的第一列(倒序),不包括首尾
注意:考虑列为1,行为1的情况;考虑进行3,5步时首尾大小问题。
代码:
1 class Solution { 2 public: 3 vector<int> printMatrix(vector<vector<int> > matrix) { 4 vector<int> ans; 5 if(matrix.empty()){ 6 return ans; 7 } 8 9 int rows = matrix.size(); 10 int columns = matrix[0].size(); 11 //注意奇数,假设行列为5,则打印中间数时,其位置为(2,2)(从0开始计数的) 12 int divRows = (rows + 1) >> 1; 13 int divColumns = (columns + 1) >> 1; 14 //选择小的考虑 15 int startSize = divRows > divColumns?divColumns : divRows; 16 for(int start = 0; start < startSize; ++ start){ 17 //每打印一圈时,行和列都需要递减 18 int columnsEnd = columns - 1 - start; 19 int rowsEnd = rows - 1 - start; 20 //打印当前圈的上面的行 21 for(int i = start; i <= columnsEnd; ++ i){ 22 ans.push_back(matrix[start][i]); 23 } 24 25 //打印当前圈的最后列 26 for(int i = start + 1; i <= rowsEnd - 1; ++ i){ 27 ans.push_back(matrix[i][columnsEnd]); 28 } 29 30 //打印当前圈的最后行,最后行必须要大于start,否则就可能会重复打印第一行,考虑只有一行的情况 31 if(rowsEnd > start){ 32 for(int i = columnsEnd;i >= start; -- i){ 33 ans.push_back(matrix[rowsEnd][i]); 34 } 35 } 36 37 //打印当前圈的第一列,当前列必须小于columnsEnd,否则可能会重复打印最后列,考虑只有一列的情况 38 if(rowsEnd > 1){ 39 for(int i = rowsEnd - 1; columnsEnd > start && i >= start + 1; -- i){ 40 ans.push_back(matrix[i][start]); 41 } 42 } 43 44 } 45 46 return ans; 47 } 48 };
浙公网安备 33010602011771号