加载中...
1975-最大方阵和(Maximum Matrix Sum)
发表于:2021-12-03 | 分类: 中等
字数统计: 716 | 阅读时长: 3分钟 | 阅读量:

原文链接: https://leetcode-cn.com/problems/maximum-matrix-sum

英文原文

You are given an n x n integer matrix. You can do the following operation any number of times:

  • Choose any two adjacent elements of matrix and multiply each of them by -1.

Two elements are considered adjacent if and only if they share a border.

Your goal is to maximize the summation of the matrix's elements. Return the maximum sum of the matrix's elements using the operation mentioned above.

 

Example 1:

Input: matrix = [[1,-1],[-1,1]]
Output: 4
Explanation: We can follow the following steps to reach sum equals 4:
- Multiply the 2 elements in the first row by -1.
- Multiply the 2 elements in the first column by -1.

Example 2:

Input: matrix = [[1,2,3],[-1,-2,-3],[1,2,3]]
Output: 16
Explanation: We can follow the following step to reach sum equals 16:
- Multiply the 2 last elements in the second row by -1.

 

Constraints:

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

中文题目

给你一个 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

通过代码

高赞题解

5835. 最大方阵和

第二题

刚开始我用了深度搜索,结果越写越觉得不对劲,最后发现:

其实如果负数数量是双数,我们总是能把他们都翻成正数

如果负数数量是单数,我们怎么翻都会至少留下一个负数

以上,记录下矩阵里绝对值最小的数即可

(我是笨比)

模拟

class Solution {
public:
    long long maxMatrixSum(vector<vector<int>>& matrix) {
        int minn = abs(matrix[0][0]);
        long long ans = 0;
        bool flag = false; //记录是负数的个数是单数还是双数
        for(auto &vec: matrix)
            for(int num: vec){
                if(num < 0){  //是负数的话
                    flag = !flag;  
                    num = -num;  //取绝对值
                }
                ans += num;  //记录绝对值的和
                minn = min(num, minn);  //记录最小值
            }
        if(flag) //是单数
        return ans - 2 * minn;
        return ans;//是双数
    }
};

统计信息

通过次数 提交次数 AC比率
3161 8185 38.6%

提交历史

提交时间 提交结果 执行时间 内存消耗 语言
上一篇:
1974-使用特殊打字机键入单词的最少时间(Minimum Time to Type Word Using Special Typewriter)
下一篇:
1976-到达目的地的方案数(Number of Ways to Arrive at Destination)
本文目录
本文目录