Maximum difference of sum of elements in two rows in a matrix
Given a matrix of m*n order, the task is to find the maximum difference between two rows Rj and Ri such that i < j, i.e., we need to find maximum value of sum(Rj) – sum(Ri) such that row i is above row j.
Examples:
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
A simple solution for this problem is to one by one select each row, compute sum of elements in it and take difference from sum of next rows in forward direction. Finally return the maximum difference. Time complexity for this approach will be O(n*m2).
An efficient solution solution for this problem is to first calculate the sum of all elements of each row and store them in an auxiliary array rowSum[] and then calculate maximum difference of two elements max(rowSum[j] – rowSum[i]) such that rowSum[i] < rowSum[j] in linear time. See this article. In this method, we need to keep track of 2 things:
- Maximum difference found so far (max_diff).
- Minimum number visited so far (min_element).
Implementation:
C++
#include<bits/stdc++.h>
#define MAX 100
using namespace std;
int maxRowDiff( int mat[][MAX], int m, int n)
{
int rowSum[m];
for ( int i=0; i<m; i++)
{
int sum = 0;
for ( int j=0; j<n; j++)
sum += mat[i][j];
rowSum[i] = sum;
}
int max_diff = rowSum[1] - rowSum[0];
int min_element = rowSum[0];
for ( int i=1; i<m; i++)
{
if (rowSum[i] - min_element > max_diff)
max_diff = rowSum[i] - min_element;
if (rowSum[i] < min_element)
min_element = rowSum[i];
}
return max_diff;
}
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;
}
|
C
#include <stdio.h>
#define MAX 100
int maxRowDiff( int mat[][MAX], int m, int n)
{
int rowSum[m];
for ( int i=0; i<m; i++)
{
int sum = 0;
for ( int j=0; j<n; j++)
sum += mat[i][j];
rowSum[i] = sum;
}
int max_diff = rowSum[1] - rowSum[0];
int min_element = rowSum[0];
for ( int i=1; i<m; i++)
{
if (rowSum[i] - min_element > max_diff)
max_diff = rowSum[i] - min_element;
if (rowSum[i] < min_element)
min_element = rowSum[i];
}
return max_diff;
}
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}};
printf ( "%d" ,maxRowDiff(mat, m, n));
return 0;
}
|
Java
import java.io.*;
class GFG {
static final int MAX = 100 ;
static int maxRowDiff( int mat[][], int m, int n) {
int rowSum[] = new int [m];
for ( int i = 0 ; i < m; i++) {
int sum = 0 ;
for ( int j = 0 ; j < n; j++)
sum += mat[i][j];
rowSum[i] = sum;
}
int max_diff = rowSum[ 1 ] - rowSum[ 0 ];
int min_element = rowSum[ 0 ];
for ( int i = 1 ; i < m; i++) {
if (rowSum[i] - min_element > max_diff)
max_diff = rowSum[i] - min_element;
if (rowSum[i] < min_element)
min_element = rowSum[i];
}
return max_diff;
}
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));
}
}
|
Python3
def maxRowDiff(mat, m, n):
rowSum = [ 0 ] * m
for i in range ( 0 , m):
sum = 0
for j in range ( 0 , n):
sum + = mat[i][j]
rowSum[i] = sum
max_diff = rowSum[ 1 ] - rowSum[ 0 ]
min_element = rowSum[ 0 ]
for i in range ( 1 , m):
if (rowSum[i] - min_element > max_diff):
max_diff = rowSum[i] - min_element
if (rowSum[i] < min_element):
min_element = rowSum[i]
return max_diff
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))
|
C#
using System;
class GFG {
static int maxRowDiff( int [,] mat,
int m, int n)
{
int [] rowSum = new int [m];
for ( int i = 0; i < m; i++)
{
int sum = 0;
for ( int j = 0; j < n; j++)
sum += mat[i,j];
rowSum[i] = sum;
}
int max_diff = rowSum[1] - rowSum[0];
int min_element = rowSum[0];
for ( int i = 1; i < m; i++)
{
if (rowSum[i] - min_element
> max_diff)
max_diff = rowSum[i]
- min_element;
if (rowSum[i] < min_element)
min_element = rowSum[i];
}
return max_diff;
}
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));
}
}
|
PHP
<?php
$MAX = 100;
function maxRowDiff( $mat , $m , $n )
{
global $MAX ;
$rowSum = array ();
for ( $i = 0; $i < $m ; $i ++)
{
$sum = 0;
for ( $j = 0; $j < $n ; $j ++)
$sum += $mat [ $i ][ $j ];
$rowSum [ $i ] = $sum ;
}
$max_diff = $rowSum [1] - $rowSum [0];
$min_element = $rowSum [0];
for ( $i = 1; $i < $m ; $i ++)
{
if ( $rowSum [ $i ] - $min_element > $max_diff )
$max_diff = $rowSum [ $i ] - $min_element ;
if ( $rowSum [ $i ] < $min_element )
$min_element = $rowSum [ $i ];
}
return $max_diff ;
}
$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 );
?>
|
Javascript
<script>
function maxRowDiff(mat, m, n)
{
let rowSum = new Array(m);
for (let i = 0; i < m; i++)
{
let sum = 0;
for (let j = 0; j < n; j++)
sum += mat[i][j];
rowSum[i] = sum;
}
let max_diff = rowSum[1] - rowSum[0];
let min_element = rowSum[0];
for (let i = 1; i < m; i++)
{
if (rowSum[i] - min_element > max_diff)
max_diff = rowSum[i] - min_element;
if (rowSum[i] < min_element)
min_element = rowSum[i];
}
return max_diff;
}
let m = 5, n = 4;
let mat = [ [ -1, 2, 3, 4 ],
[ 5, 3, -2, 1 ],
[ 6, 7, 2, -3 ],
[ 2, 9, 1, 4 ],
[ 2, 1, -2, 0 ] ];
document.write(maxRowDiff(mat, m, n));
</script>
|
Time Complexity : O(m*n)
Auxiliary Space : O(m)
Last Updated :
11 Sep, 2023
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...