LeetCode 1975.最大方阵和:脑筋急转弯

【LetMeFly】1975.最大方阵和:脑筋急转弯

力扣题目链接:https://leetcode.cn/problems/maximum-matrix-sum/

给你一个 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
  • -105 <= matrix[i][j] <= 105

解题方法:脑筋急转弯

解这道题只需要明白:

  1. 只能相邻取负 等价于 可任意两元素取负

就够了。

But Why?

知道链式效应么(名字瞎起的),[a, b, c, d]中若想实现a, d取负则可通过a, bb, cc, d取负的方式实现,其中中间的bc都取负了偶数次,相当于没变。

所以我们可以得到:

  • 若matrix中有偶数个负数,那么两两配对并取反,相当于全是正数!
  • 若matrix中有奇数个负数,那么最终一定会有一个负数无法通过负数们"内部消化",这个负数找一个矩阵中绝对值最小的数并让它当负数自己当正数就好了。

具体而言,遍历一遍矩阵,累加每个数的绝对值,并记下绝对值最小的数、负数的个数。

若负数有奇数个,则累加结果减去两倍最小绝对值。

  • 时间复杂度 O ( n 2 ) O(n^2) O(n2),其中 S I Z E ( m a t r i x ) = n × n SIZE(matrix)=n\times n SIZE(matrix)=n×n。
  • 空间复杂度 O ( 1 ) O(1) O(1)

AC代码

C++
cpp 复制代码
/*
 * @LastEditTime: 2026-01-05 13:39:00
 */
typedef long long ll;
class Solution {
public:
    ll maxMatrixSum(vector<vector<int>>& matrix) {
        int minium = 1000000;
        int cntNeg = 0;
        ll ans = 0;
        for (vector<int>& row : matrix) {
            for (int t : row) {
                ans += abs(t);
                if (t < 0) {
                    cntNeg++;
                }
                minium = min(minium, abs(t));
            }
        }
        if (cntNeg % 2) {
            ans -= minium * 2;
        }
        return ans;
    }
};

/*
[[-1,0,-1],[-2,1,3],[3,2,2]]

-1 0 -1
-2 1 3
3  2 2
*/

/*
[[2,9,3],[5,4,-4],[1,7,1]]

2 9 3
5 4 -4
1 7 1

34
*/
Python
python 复制代码
'''
LastEditTime: 2026-01-05 13:41:10
'''
from typing import List

class Solution:
    def maxMatrixSum(self, matrix: List[List[int]]) -> int:
        mini = 1000000
        cntNeg = 0
        ans = 0
        for row in matrix:
            for t in row:
                ans += abs(t)
                if t < 0:
                    cntNeg += 1
                mini = min(mini, abs(t))
        if cntNeg % 2:
            ans -= 2 * mini
        return ans
Java
java 复制代码
/*
 * @LastEditTime: 2026-01-05 18:43:31
 */
class Solution {
    public long maxMatrixSum(int[][] matrix) {
        long ans = 0;
        int cnt = 0, min = 1000000;
        for (int[] row : matrix) {
            for (int t : row) {
                if (t < 0) {
                    cnt++;
                }
                t = Math.abs(t);
                ans += t;
                min = Math.min(min, t);
            }
        }
        if (cnt % 2 == 1) {
            ans -= 2 * min;
        }
        return ans;
    }
}
Go
go 复制代码
/*
 * @LastEditTime: 2026-01-05 18:45:13
 */
package main

func abs1975(a int) int {
    if a < 0 {
        return -a
    }
    return a
}

func maxMatrixSum(matrix [][]int) (ans int64) {
    cnt, mini := 0, 1000000
    for _, row := range matrix {
        for _, t := range row {
            if t < 0 {
                cnt++
            }
            t = abs1975(t)
            ans += int64(t)
            mini = min(mini, t)
        }
    }
    if cnt % 2 == 1 {
        ans -= 2 * int64(mini)
    }
    return
}
Rust
rust 复制代码
/*
 * @LastEditTime: 2026-01-05 13:43:32
 */
impl Solution {
    pub fn max_matrix_sum(matrix: Vec<Vec<i32>>) -> i64 {
        let mut ans: i64 = 0;
        let mut mini: i32 = 1000000;
        let mut cnt_neg: i32 = 0;
        for row in matrix.iter() {
            for t in row.iter() {
                ans += t.abs() as i64;
                if *t < 0 {
                    cnt_neg += 1;
                }
                mini = mini.min(t.abs());
            }
        }
        if cnt_neg % 2 == 1 {
            ans -= 2 * mini as i64;
        }
        ans
    }
}

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

千篇源码题解已开源

相关推荐
苦藤新鸡11 小时前
6.三数之和
c语言·c++·算法·力扣
s090713611 小时前
连通域标记:从原理到数学公式全解析
图像处理·算法·fpga开发·连通域标记
@小码农11 小时前
6547网:202512 GESP认证 C++编程 一级真题题库(附答案)
java·c++·算法
自然语12 小时前
人工智能之数字生命-特征类升级20260106
人工智能·算法
菜鸟233号12 小时前
力扣343 整数拆分 java实现
java·数据结构·算法·leetcode
赫凯12 小时前
【强化学习】第五章 时序差分算法
算法
leiming612 小时前
c++ find_if 算法
开发语言·c++·算法
yuanmenghao12 小时前
自动驾驶中间件iceoryx - 内存与 Chunk 管理(三)
数据结构·c++·算法·链表·中间件·自动驾驶
_OP_CHEN12 小时前
【算法基础篇】(四十三)数论之费马小定理深度解析:从同余性质到乘法逆元
c++·算法·蓝桥杯·数论·acm/icpc
水月wwww12 小时前
【算法设计】分支限界法
算法·分支限界法