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
这个题换个说法,其实就是, 我们可以任意的移动负号(-), 当 2 个负号凑到一起可以消除。
如果有偶数个负数, 我们可以把它们都变成正数
如果有奇数个负数, 最终会剩余一个负数,但是因为我们可以自由移动负号, 我们可以把负号移动到绝对值最小的数上以获取最大的加和
impl Solution {
pub fn max_matrix_sum(matrix: Vec<Vec<i32>>) -> i64 {
let mut negative_count = 0;
let mut positives = Vec::new();
for l in matrix {
for v in l {
if v < 0 {
negative_count += 1;
}
positives.push(v.abs() as i64);
}
}
positives.sort();
if negative_count % 2 == 1 {
positives[0] = -positives[0];
}
positives.into_iter().sum()
}
}