这是我参与8月更文挑战的第23天,活动详情查看:8月更文挑战
1975. 最大方阵和
给你一个 n x n 的整数方阵 matrix 。你可以执行以下操作 任意次 :
选择 matrix 中 相邻 两个元素,并将它们都 乘以 -1 。 如果两个元素有 公共边 ,那么它们就是 相邻 的。
你的目的是 最大化 方阵元素的和。请你在执行以上操作之后,返回方阵的 最大 和。
- 示例 1:
输入:matrix = [[1,-1],[-1,1]] 输出:4 解释:我们可以执行以下操作使和等于 4 :
- 将第一行的 2 个元素乘以 -1 。
- 将第一列的 2 个元素乘以 -1 。
- 示例 2:
输入:matrix = [[1,2,3],[-1,-2,-3],[1,2,3]] 输出:16 解释:我们可以执行以下操作使和等于 16 :
- 将第二行的最后 2 个元素乘以 -1 。
提示:
- n == matrix.length == matrix[i].length
- 2 <= n <= 250
解题思路
无论两个负数在任何位置都可以两两抵消,变为两个正数
如图,截取二维数组的一部分元素
我们需要将-1和-9相互抵消,可以像上图一样,将标注下划线的数字取相反数,就可以使得任意位置的两个负数变为正数,其他位置不受影响
- 负数个数为偶数,刚刚好可以全部互相抵消,那么结果就是全部元素的绝对值
- 负数个数为奇数,说明无法完全抵消,最后肯定会残留一个负数,这个负数我们必须要选一个绝对值最小的数字,这样对我们的减益最小
代码
class Solution {
public long maxMatrixSum(int[][] matrix) {
long res=0,cnt=0,min=Integer.MAX_VALUE;
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[0].length; j++) {
res+= Math.abs(matrix[i][j]);
min=Math.min(min,Math.abs(matrix[i][j]));
if (matrix[i][j]<0)
{
cnt++;
}
}
}
if (cnt%2==1)
{
res-=2*min;
}
return res;
}
}