【英雄算法七月集训】Day11
本日关键字:矩阵
1975. 最大方阵和
解题思路:当负数的个数为偶数时即可以将所有的负数化为相反数;当负数的个数为奇数时,即当只有负数中最大值为负数其余转换为正数的时候,方阵和最大。
1、首先遍历方阵,找出负数,转换成正数再将其放入数组neg中,累加求和
2、然后对负数数组neg进行排序;
3、 当负数个数为奇数时,减去2倍的neg[0]
class Solution {
public:
long long maxMatrixSum(vector<vector<int>> &m) {
vector<int> neg;
int n = m.size();
int counts = 0 ;
long long sum = 0;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
if (m[i][j] < 0) {
m[i][j] = -m[i][j];
counts++;
}
neg.push_back(m[i][j]);
sum += m[i][j];
}
}
sort(neg.begin(),neg.end());
if (counts&1){
sum -= 2 * neg[0];
}
return sum;
}
};
840. 矩阵中的幻方
解题思路:题目要求 求出矩阵中符合3维幻方的个数
1、首先写出判断矩阵中从(x,y)开始的3维子矩阵是否为幻方的函数(即数字范围0-9且无重复,行列和对角线的值和相等)
2、然后遍历累加
class Solution {
int checkMS(vector<vector<int>> &grid, int x, int y) {
int n = grid.size();
int m = grid[0].size();
int sum = grid[x][y] + grid[x + 1][y] + grid[x + 2][y];
if (m < 3 || n < 3) {
return 0;
}
int hash[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < 3; ++j) {
if (grid[x+i][y+j] == 0 || grid[x+i][y+j] > 9) { return 0; }
if (++hash[grid[x+i][y+j]] > 1) { return 0; }
}
if (sum != grid[x][y + i] + grid[x + 1][y + i] + grid[x + 2][y + i]) { return 0; }
if (sum != grid[x + i][y] + grid[x + i][y + 1] + grid[x + i][y + 2]) { return 0; }
}
if (sum != grid[x][y] + grid[x + 1][y + 1] + grid[x + 2][y + 2]) { return 0; }
if (sum != grid[x + 2][y] + grid[x + 1][y + 1] + grid[x][y + 2]) { return 0; }
return 1;
}
public:
int numMagicSquaresInside(vector<vector<int>> &grid) {
int x = grid.size();
int y = grid[0].size();
int sum = 0;
for (int i = 0; i < x - 2; ++i) {
for (int j = 0; j < y - 2; ++j) {
sum += checkMS(grid, i, j);
}
}
return sum;
}
};