题目链接:https://leetcode.com/problems/spiral-matrix-ii/description/
Given a positive integer n, generate a square matrix filled with elements from 1 to n2 in spiral order.
Example:
Input: 3 Output: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]
思路:
- 本题和 54.Spiral Matrix思路上基本一致,只不过本题是要求在矩阵中填入数据,但两者对矩阵的遍历方式一样;
- 遍历矩阵的思路可以查看这篇博文:54.Spiral Matrix
注意:这种方式定义容器vector<vector<int>> matrix(n * n); 容器元素的值是未定义的随机值,编译会导致:EXC_BAD_ACCESS (code=1, address=0x0)错误。
处理方式有两种:
1 // 第一种方式: 2 vector<vector<int>> matrix(n, vector<int>(n)); 3 4 // 第二种方式: 5 vector<vector<int> > matrix(n); 6 for ( int i = 0 ; i < n ; i++ ) 7 matrix[i].resize(n);
这样就能保证matrix中的每个元素初值为:0;
编码如下:
1 class Solution { 2 public: 3 vector<vector<int>> generateMatrix(int n) { 4 // vector<vector<int> > matrix(n); 5 // for ( int i = 0 ; i < n ; i++ ) 6 // matrix[i].resize(n); 7 vector<vector<int>> matrix(n, vector<int>(n)); 8 9 int loop = n / 2 + n % 2; 10 11 int i = 0, j = 0; // matrix[i][j] 12 int num = 1; 13 while (loop-- > 0) 14 { 15 int left_Up = 0, right_Up = n - j, right_Down = n - i, left_Down = 0; 16 // 从左上角 -> 右上角 (i, left_Up) -> (i, right_Up) == (i, left_Up) 17 for (left_Up = j; left_Up < right_Up && num <= n * n; ++left_Up) 18 { 19 matrix[i][left_Up] = num++; 20 } 21 left_Up--; 22 23 // 从右上角 -> 右下角 (right_Up = i+1, left_Up) -> (right_Down, left_Up) == (right_Up, left_Up) 24 for (right_Up = i + 1; right_Up < right_Down && num <= n * n; ++right_Up) 25 { 26 matrix[right_Up][left_Up] = num++; 27 } 28 right_Up--; 29 30 // 从右下角 -> 左下角 (right_Up, right_Down = left_Up - 1) -> (right_Up, j) == (right_Up, right_Down) 31 for (right_Down = left_Up - 1; right_Down >= j && num <= n * n; --right_Down) 32 { 33 matrix[right_Up][right_Down] = num++; 34 } 35 right_Down++; 36 37 // 从左下角 -> 左上角 (left_Up = right_Up - 1, right_Down) -> (i++, right_Down) == (left_Up, right_Down) 38 i++; 39 for (left_Up = right_Up - 1; left_Up >= i && num <= n * n; --left_Up) 40 { 41 matrix[left_Up][right_Down] = num++; 42 } 43 j++; 44 } 45 46 return matrix; 47 } 48 };