1975. 最大方阵和

487 阅读2分钟

这是我参与8月更文挑战的第23天,活动详情查看:8月更文挑战

1975. 最大方阵和

给你一个 n x n 的整数方阵 matrix 。你可以执行以下操作 任意次 :

选择 matrix 中 相邻 两个元素,并将它们都 乘以 -1 。 如果两个元素有 公共边 ,那么它们就是 相邻 的。

你的目的是 最大化 方阵元素的和。请你在执行以上操作之后,返回方阵的 最大 和。

 

  • 示例 1:

image.png

输入:matrix = [[1,-1],[-1,1]] 输出:4 解释:我们可以执行以下操作使和等于 4 :

  • 将第一行的 2 个元素乘以 -1 。
  • 将第一列的 2 个元素乘以 -1 。
  • 示例 2:

image.png

输入:matrix = [[1,2,3],[-1,-2,-3],[1,2,3]] 输出:16 解释:我们可以执行以下操作使和等于 16 :

  • 将第二行的最后 2 个元素乘以 -1 。  

提示:

  • n == matrix.length == matrix[i].length
  • 2 <= n <= 250

解题思路

无论两个负数在任何位置都可以两两抵消,变为两个正数

如图,截取二维数组的一部分元素

image.png

我们需要将-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;
    }
}