矩阵中两行元素之和的最大差异
给定一个 m*n 阶的矩阵,任务是找到两行 Rj 和 Ri 之间的最大差异,使得 i < j,即我们需要找到 sum(Rj) – sum(Ri) 的最大值使得该行i 在第 j 行上方。
例子:
Input : mat[5][4] = {{-1, 2, 3, 4},
{5, 3, -2, 1},
{6, 7, 2, -3},
{2, 9, 1, 4},
{2, 1, -2, 0}}
Output: 9
// difference of R3 - R1 is maximum
这个问题的一个简单解决方案是逐行选择每一行,计算其中元素的总和,并在前向方向上从下一行的总和中取差。最后返回最大差异。这种方法的时间复杂度为 O(n*m 2 )。
这个问题的一个有效解决方案是首先计算每一行的所有元素的总和,并将它们存储在一个辅助数组rowSum[]中,然后计算两个元素的最大差max(rowSum[j] – rowSum[i])这样那 rowSum[i] < rowSum[j] 在线性时间内。见这篇文章。在这种方法中,我们需要跟踪两件事:
1) 迄今为止发现的最大差异 (max_diff)。
2) 到目前为止访问的最小数量(min_element)。
C++
// C++ program to find maximum difference of sum of
// elements of two rows
#include
#define MAX 100
using namespace std;
// Function to find maximum difference of sum of
// elements of two rows such that second row appears
// before first row.
int maxRowDiff(int mat[][MAX], int m, int n)
{
// auxiliary array to store sum of all elements
// of each row
int rowSum[m];
// calculate sum of each row and store it in
// rowSum array
for (int i=0; i max_diff)
max_diff = rowSum[i] - min_element;
// if new element is less than previous minimum
// element then update it so that
// we may get maximum difference in remaining array
if (rowSum[i] < min_element)
min_element = rowSum[i];
}
return max_diff;
}
// Driver program to run the case
int main()
{
int m = 5, n = 4;
int mat[][MAX] = {{-1, 2, 3, 4},
{5, 3, -2, 1},
{6, 7, 2, -3},
{2, 9, 1, 4},
{2, 1, -2, 0}};
cout << maxRowDiff(mat, m, n);
return 0;
}
Java
// Java program to find maximum difference
// of sum of elements of two rows
class GFG {
static final int MAX = 100;
// Function to find maximum difference of sum
// of elements of two rows such that second
// row appears before first row.
static int maxRowDiff(int mat[][], int m, int n) {
// auxiliary array to store sum
// of all elements of each row
int rowSum[] = new int[m];
// calculate sum of each row and
// store it in rowSum array
for (int i = 0; i < m; i++) {
int sum = 0;
for (int j = 0; j < n; j++)
sum += mat[i][j];
rowSum[i] = sum;
}
// calculating maximum difference of two elements
// such that rowSum[i] max_diff)
max_diff = rowSum[i] - min_element;
// if new element is less than previous
// minimum element then update it so that
// we may get maximum difference in remaining array
if (rowSum[i] < min_element)
min_element = rowSum[i];
}
return max_diff;
}
// Driver code
public static void main(String[] args) {
int m = 5, n = 4;
int mat[][] = {{-1, 2, 3, 4 },
{5, 3, -2, 1 },
{6, 7, 2, -3},
{2, 9, 1, 4 },
{2, 1, -2, 0}};
System.out.print(maxRowDiff(mat, m, n));
}
}
// This code is contributed by Anant Agarwal.
Python3
# Python3 program to find maximum difference
# of sum of elements of two rows
# Function to find maximum difference of
# sum of elements of two rows such that
# second row appears before first row.
def maxRowDiff(mat, m, n):
# auxiliary array to store sum of
# all elements of each row
rowSum = [0] * m
# calculate sum of each row and
# store it in rowSum array
for i in range(0, m):
sum = 0
for j in range(0, n):
sum += mat[i][j]
rowSum[i] = sum
# calculating maximum difference of
# two elements such that
# rowSum[i] max_diff):
max_diff = rowSum[i] - min_element
# if new element is less than previous
# minimum element then update it so
# that we may get maximum difference
# in remaining array
if (rowSum[i] < min_element):
min_element = rowSum[i]
return max_diff
# Driver program to run the case
m = 5
n = 4
mat = [[-1, 2, 3, 4],
[5, 3, -2, 1],
[6, 7, 2, -3],
[2, 9, 1, 4],
[2, 1, -2, 0]]
print( maxRowDiff(mat, m, n))
# This code is contributed by Swetank Modi
C#
// C# program to find maximum difference
// of sum of elements of two rows
using System;
class GFG {
// Function to find maximum difference
// of sum of elements of two rows such
// that second row appears before
// first row.
static int maxRowDiff(int [,] mat,
int m, int n)
{
// auxiliary array to store sum
// of all elements of each row
int [] rowSum = new int[m];
// calculate sum of each row and
// store it in rowSum array
for (int i = 0; i < m; i++)
{
int sum = 0;
for (int j = 0; j < n; j++)
sum += mat[i,j];
rowSum[i] = sum;
}
// calculating maximum difference
// of two elements such that
// rowSum[i] < rowsum[j]
int max_diff = rowSum[1] - rowSum[0];
int min_element = rowSum[0];
for (int i = 1; i < m; i++)
{
// if current difference is
// greater than previous then
// update it
if (rowSum[i] - min_element
> max_diff)
max_diff = rowSum[i]
- min_element;
// if new element is less than
// previous minimum element then
// update it so that we may get
// maximum difference in
// remaining array
if (rowSum[i] < min_element)
min_element = rowSum[i];
}
return max_diff;
}
// Driver code
public static void Main()
{
int m = 5, n = 4;
int [,] mat = { {-1, 2, 3, 4 },
{5, 3, -2, 1 },
{6, 7, 2, -3},
{2, 9, 1, 4 },
{2, 1, -2, 0} };
Console.Write(maxRowDiff(mat, m, n));
}
}
// This code is contributed by KRV.
PHP
$max_diff)
$max_diff = $rowSum[$i] - $min_element;
// if new element is less
// than previous minimum
// element then update it
// so that we may get maximum
// difference in remaining array
if ($rowSum[$i] < $min_element)
$min_element = $rowSum[$i];
}
return $max_diff;
}
// Driver Code
$m = 5;
$n = 4;
$mat = array(array(-1, 2, 3, 4),
array(5, 3, -2, 1),
array(6, 7, 2, -3),
array(2, 9, 1, 4),
array(2, 1, -2, 0));
echo maxRowDiff($mat, $m, $n);
// This code is contributed by ajit
?>
Javascript
输出:
9
时间复杂度: O(m*n)
辅助空间: O(m)