2018-06-05|2018-06-05 840. Magic Squares In Grid

【2018-06-05|2018-06-05 840. Magic Squares In Grid】题意:给你一个二维数组,判断有多少个神奇正方形,神奇正方形:三行三列,包含1-9个不同的数字,每行、每列、每个对角线加起来和相等。
解题思路:
遍历这个二维数组,行和列都为从0—— (size()-2),然后判断这九个数是否构成神奇正方形。

class Solution { public: int numMagicSquaresInside(vector>& 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> & grid){ int sum = grid[i][j] + grid[i][j+1] + grid[i][j+2]; vector 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即可。

    推荐阅读