一、题目
1975. 最大方阵和
给你一个 n x n
的整数方阵 matrix
。你可以执行以下操作 任意次 :
- 选择
matrix
中 相邻 两个元素,并将它们都 乘以-1
。 - 如果两个元素有 公共边 ,那么它们就是 相邻 的。
你的目的是 最大化 方阵元素的和。请你在执行以上操作之后,返回方阵的 最大和。
二、算法思路
思路一
就像数字华容道游戏一样,可以把一个负号一步一步在地图上移动,遇到新的负号就双双变为正号,也就是整个地图里,负号是偶数个就可以全部消失,如何是奇数个,最后就会只剩一个,而这个放在绝对值最小的数上,就可以让整体最大。
- 如果矩阵中负数的个数为偶数或是0,那么经过任意次的翻转,矩阵中就全为偶数。直接累加返回即可。
- 如果矩阵中的负数为奇数个,只需找出矩阵中绝对值最小的数(min),再用矩阵绝对值和-min*2返回即可
减去最小值,才会使和最大。*2是因为sum绝对值总和,计算时已经加过一遍最小值
源码
class Solution {
public long maxMatrixSum(int[][] matrix) {
long res;
long sum=0;
long jisum=0;
int min=Integer.MAX_VALUE;
for (int[] ints : matrix) {
for (int anInt : ints) {
if (anInt < 0) {
jisum++; //奇数个数
anInt=-anInt;
}
//sum += Math.abs(anInt);
sum+=anInt;
min = Math.min(min, anInt);
}
}
if(jisum % 2==0){
res=sum;
}else{
res=sum-min*2L;
}
return res;
}
}
时间和空间复杂度
时间复杂度:O(1)
空间复杂度:O(nn),n为矩阵长度
三、所用API
Math.min()