📌  相关文章
📜  矩阵中两行元素之和的最大差异

📅  最后修改于: 2022-05-13 01:57:22.280000             🧑  作者: Mango

矩阵中两行元素之和的最大差异

给定一个 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)