1.LeetCode:1975. 最大方阵和
给你一个 n x n 的整数方阵 matrix 。你可以执行以下操作 任意次 :
选择 matrix 中 相邻 两个元素,并将它们都 乘以 -1 。
如果两个元素有 公共边 ,那么它们就是 相邻 的。
你的目的是 最大化 方阵元素的和。请你在执行以上操作之后,返回方阵的 最大 和。
示例 1:
输入:matrix = [[1,-1],[-1,1]]
输出:4
示例 2:
输入:matrix = [[1,2,3],[-1,-2,-3],[1,2,3]]
输出:16
提示:
n == matrix.length == matrix[i].length
2 <= n <= 250
-1e5 <= matrix[i][j] <= 1e5
这道题直接说要点吧,如果矩阵内有偶数个负数,一定可以通过某些操作把他们全部变为正数,不论他们相邻与否,比如 下面这个矩阵(很明显就看出来了不再解释了,在矩阵较为复杂的时候可以看作从一个负数出发,从四个方向找到另一个负数并返回的过程)
【1,-1,2】
【2,1,3】
【5,2,-3】
那么如果有奇数个呢?这个时候我们看矩阵内是否有0,因为0不是正数也不是负数,那么我们不妨把他看成负数,反正0也不改变矩阵内的总和。那么现在负数就有偶数个了,可以把所有负数全部转换为正数。
如果没有0呢,在所有负数和正数之间找一个绝对值最小的,把他作为剩下的那个负数最后减去他给结果带来的影响即可。由于我是直接先计算所有数绝对值的和再处理结果的,所以下面的代码中减去了两次。
class Solution {
public:
long long maxMatrixSum(vector<vector<int>>& matrix) {
int cnt=0;
int n=matrix.size();
int infsum=0;
int infmax=0x3f3f3f3f;
long long sum=0;
bool flag=false;
for(int i=0;i<n;++i){
for(int j=0;j<n;++j){
if(matrix[i][j]<0){
cnt++;
}
int tmp=abs(matrix[i][j]);
infmax=min(infmax,tmp);
sum+=tmp;
if(matrix[i][j]==0){
flag=true;
}
}
}
if(cnt%2&&!flag){
sum-=2*infmax;
}
return sum;
}
};
2.LeetCode:840. 矩阵中的幻方
3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。
给定一个由整数组成的row x col 的 grid,其中有多少个 3 × 3 的 “幻方” 子矩阵?(每个子矩阵都是连续的)。
示例 1:
输入: grid = [[4,3,8,4],[9,5,1,9],[2,7,6,2]
输出: 1
示例 2:
输出: grid = [[8]]
输入: 0
提示:
row == grid.length
col == grid[i].length
1 <= row, col <= 10
0 <= grid[i][j] <= 15
这道题怎么说呢,如果对于这类题目敏感度够高的话会立刻想到打表,不过打表的基础还是建立在暴力的基础上的,所以这里介绍暴力的做法。
怎么暴力呢?枚举所有的3 * 3的子矩阵,判断所有行,列,主副对角线总和是否相等,以及矩阵内的数字是否是1-9之内并且不重复即可。
class Solution {
int row,col;
int hash[10];
bool check(vector<vector<int>>& a,int x,int y){
memset(hash,0,sizeof(hash));
int sum=a[x][y]+a[x][y+1]+a[x][y+2];
for(int i=0;i<3;++i){
if(sum!=a[x+i][y]+a[x+i][y+1]+a[x+i][y+2]){
return false;
}
if(sum!=a[x][y+i]+a[x+1][y+i]+a[x+2][y+i]){
return false;
}
}
if(sum!=a[x][y]+a[x+1][y+1]+a[x+2][y+2]||sum!=a[x][y+2]+a[x+1][y+1]+a[x+2][y]){
return false;
}
for(int i=0;i<3;++i){
for(int j=0;j<3;++j){
if(a[x+i][y+j]>9||a[x+i][y+j]<=0){
return false;
}
if(hash[a[x+i][y+j]]){
return false;
}
++hash[a[x+i][y+j]];
}
}
return true;
}
public:
int numMagicSquaresInside(vector<vector<int>>& grid) {
row=grid.size();
col=grid.size();
int ans=0;
for(int i=0;i<row-2;++i){
for(int j=0;j<col-2;++j){
ans+=check(grid,i,j);
}
}
return ans;
}
};