题意:给你一个二维数组,判断有多少个神奇正方形,神奇正方形:三行三列,包含1-9个不同的数字,每行、每列、每个对角线加起来和相等。
解题思路:
遍历这个二维数组,行和列都为从0—— (size()-2),然后判断这九个数是否构成神奇正方形。
class Solution {
public:
int numMagicSquaresInside(vector<vector<int>>& grid) {
int cnt = 0;
for(int i = 0; i < (int)grid.size()-2; i++){
for(int j = 0; j < (int)grid[i].size()-2; j++){
if(isMagicSquare(i, j, grid))
cnt++;
}
}
return cnt;
}
int isMagicSquare(int i, int j, vector<vector<int>> & grid){
int sum = grid[i][j] + grid[i][j+1] + grid[i][j+2];
vector<int> nums(10);
for(int k1 = 0; k1 < 3; k1++){
int row = 0, column = 0;
for(int k2 = 0; k2 < 3; k2++){
row += grid[i+k1][j+k2];
column += grid[i+k2][j+k1];
if(0 < grid[i+k1][j+k2] && grid[i+k1][j+k2] < 10)
nums[grid[i+k1][j+k2]] = grid[i+k1][j+k2];
else
return false;
}
if(row != sum || column != sum)
return false;
}
int dia1 = 0, dia2 = 0;
for(int k3 = 0; k3 < 3; k3++){
dia1 += grid[i+k3][j+k3];
dia2 += grid[i+k3][j+2-k3];
}
if(dia1 != sum || dia2 != sum)
return false;
for(int q = 1; q < 10; q++)
if(nums[q] != q)
return false;
return true;
}
};
需要注意的是:
在遍历二维数组的时候,vector.size()函数返回的类型是size_type,“size_type由string类类型和vector类类型定义的类型,用以保存任意string对象或vector对象的长度,标准库类型将size_type定义为unsigned类型。”
所以说size_type类型为无符号型,当使用vector.size() – 2作为判断条件是,可能出现vector.size()小于2的情况,这是会出现内存溢出或内存截断的问题,造成判断条件失效。
解决办法是使用强制类型转换,(int)vector.size() -2即可。