📌  相关文章
📜  查找矩阵中除给定单元格的行和/或列中的元素之外的所有元素的总和?

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

查找矩阵中除给定单元格的行和/或列中的元素之外的所有元素的总和?

给定一个二维矩阵和一组单元格索引,例如,一个 (i, j) 数组,其中 i 表示行和 j 列。对于每个给定的单元格索引 (i, j),求除第 i 行和/或第 j 列中存在的元素之外的所有矩阵元素的总和。
例子:

mat[][]  = { {1, 1, 2}
             {3, 4, 6}
             {5, 3, 2} }
Array of Cell Indexes: {(0, 0), (1, 1), (0, 1)}
Output:  15, 10, 16

我们强烈建议您最小化您的浏览器并首先自己尝试。
一个简单的解决方案是一个一个地考虑所有给定的单元格索引。对于每个单元格索引 (i, j),找到在第 i 行或第 j 列不存在的矩阵元素的总和。下面是 Naive 方法的 C++ 实现。

C++
#include
#define R 3
#define C 3
using namespace std;
 
// A structure to represent a cell index
struct Cell
{
    int r; // r is row, varies from 0 to R-1
    int c; // c is column, varies from 0 to C-1
};
 
// A simple solution to find sums for a given array of cell indexes
void printSums(int mat[][C], struct Cell arr[], int n)
{
    // Iterate through all cell indexes
    for (int i=0; i


Java
// Java implementation of the approach
class GFG
{
 
    static int R = 3;
    static int C = 3;
 
    // A structure to represent a cell index
    static class Cell
    {
 
        int r; // r is row, varies from 0 to R-1
        int c; // c is column, varies from 0 to C-1
 
        public Cell(int r, int c)
        {
            this.r = r;
            this.c = c;
        }
 
    };
 
    // A simple solution to find sums for
    // a given array of cell indexes
    static void printSums(int mat[][], Cell arr[], int n)
    {
        // Iterate through all cell indexes
        for (int i = 0; i < n; i++)
        {
            int sum = 0, r = arr[i].r, c = arr[i].c;
 
            // Compute sum for current cell index
            for (int j = 0; j < R; j++)
            {
                for (int k = 0; k < C; k++)
                {
                    if (j != r && k != c)
                    {
                        sum += mat[j][k];
                    }
                }
            }
            System.out.println(sum);
        }
    }
 
    // Driver code
    public static void main(String[] args)
    {
        int mat[][] = {{1, 1, 2}, {3, 4, 6}, {5, 3, 2}};
        Cell arr[] = {new Cell(0, 0), new Cell(1, 1), new Cell(0, 1)};
        int n = arr.length;
        printSums(mat, arr, n);
    }
}
 
// This code is contributed by Princi Singh


Python3
# Python3 implementation of the approach
 
# A structure to represent a cell index
class Cell:
 
    def __init__(self, r, c):
        self.r = r # r is row, varies from 0 to R-1
        self.c = c # c is column, varies from 0 to C-1
 
# A simple solution to find sums
# for a given array of cell indexes
def printSums(mat, arr, n):
 
    # Iterate through all cell indexes
    for i in range(0, n):
     
        Sum = 0; r = arr[i].r; c = arr[i].c
 
        # Compute sum for current cell index
        for j in range(0, R):
            for k in range(0, C):
                if j != r and k != c:
                    Sum += mat[j][k]
        print(Sum)
 
# Driver Code
if __name__ == "__main__":
 
    mat = [[1, 1, 2], [3, 4, 6], [5, 3, 2]]
    R = C = 3
    arr = [Cell(0, 0), Cell(1, 1), Cell(0, 1)]
    n = len(arr)
    printSums(mat, arr, n)
     
# This code is contributed by Rituraj Jain


C#
// C# implementation of the approach
using System;
     
class GFG
{
 
    static int R = 3;
    static int C = 3;
 
    // A structure to represent a cell index
    public class Cell
    {
 
        public int r; // r is row, varies from 0 to R-1
        public int c; // c is column, varies from 0 to C-1
 
        public Cell(int r, int c)
        {
            this.r = r;
            this.c = c;
        }
 
    };
 
    // A simple solution to find sums for
    // a given array of cell indexes
    static void printSums(int [,]mat, Cell []arr, int n)
    {
        // Iterate through all cell indexes
        for (int i = 0; i < n; i++)
        {
            int sum = 0, r = arr[i].r, c = arr[i].c;
 
            // Compute sum for current cell index
            for (int j = 0; j < R; j++)
            {
                for (int k = 0; k < C; k++)
                {
                    if (j != r && k != c)
                    {
                        sum += mat[j,k];
                    }
                }
            }
            Console.WriteLine(sum);
        }
    }
 
    // Driver code
    public static void Main(String[] args)
    {
        int [,]mat = {{1, 1, 2}, {3, 4, 6}, {5, 3, 2}};
        Cell []arr = {new Cell(0, 0), new Cell(1, 1), new Cell(0, 1)};
        int n = arr.Length;
        printSums(mat, arr, n);
    }
}
 
/* This code is contributed by PrinciRaj1992 */


Javascript


C++
// An efficient C++ program to compute sum for given array of cell indexes
#include
#define R 3
#define C 3
using namespace std;
 
// A structure to represent a cell index
struct Cell
{
    int r; // r is row, varies from 0 to R-1
    int c; // c is column, varies from 0 to C-1
};
 
void printSums(int mat[][C], struct Cell arr[], int n)
{
    int sum = 0;
    int row[R] = {};
    int col[C] = {};
 
    // Compute sum of all elements, sum of every row and sum every column
    for (int i=0; i


Java
// An efficient Java program to compute
// sum for given array of cell indexes
class GFG
{
static int R = 3;
static int C = 3;
 
// A structure to represent a cell index
static class Cell
{
    int r; // r is row, varies from 0 to R-1
    int c; // c is column, varies from 0 to C-1
 
    public Cell(int r, int c)
    {
        this.r = r;
        this.c = c;
    }    
};
 
static void printSums(int mat[][],
                       Cell arr[], int n)
{
    int sum = 0;
    int []row = new int[R];
    int []col = new int[C];
 
    // Compute sum of all elements,
    // sum of every row and sum every column
    for (int i = 0; i < R; i++)
    {
        for (int j = 0; j < C; j++)
        {
                sum += mat[i][j];
                col[j] += mat[i][j];
                row[i] += mat[i][j];
        }
    }
 
    // Compute the desired sum
    // for all given cell indexes
    for (int i = 0; i < n; i++)
    {
        int ro = arr[i].r, co = arr[i].c;
        System.out.println(sum - row[ro] - col[co] +
                                 mat[ro][co]);
    }
}
 
// Driver Code
public static void main(String[] args)
{
    int mat[][] = {{1, 1, 2},
                   {3, 4, 6},
                   {5, 3, 2}};
    Cell arr[] = {new Cell(0, 0),
                  new Cell(1, 1),
                  new Cell(0, 1)};
    int n = arr.length;
    printSums(mat, arr, n);
}
}
 
// This code is contributed by Princi Singh


Python3
# Python3 implementation of the approach
 
# A structure to represent a cell index
class Cell:
 
    def __init__(self, r, c):
        self.r = r # r is row, varies from 0 to R-1
        self.c = c # c is column, varies from 0 to C-1
 
# A simple solution to find sums
# for a given array of cell indexes
def printSums(mat, arr, n):
 
    Sum = 0
    row, col = [0] * R, [0] * C
 
    # Compute sum of all elements,
    # sum of every row and sum every column
    for i in range(0, R):
        for j in range(0, C):
            Sum += mat[i][j]
            row[i] += mat[i][j]
            col[j] += mat[i][j]
 
    # Compute the desired sum
    # for all given cell indexes
    for i in range(0, n):
        r0, c0 = arr[i].r, arr[i].c
        print(Sum - row[r0] - col[c0] + mat[r0][c0])
 
# Driver Code
if __name__ == "__main__":
 
    mat = [[1, 1, 2], [3, 4, 6], [5, 3, 2]]
    R = C = 3
    arr = [Cell(0, 0), Cell(1, 1), Cell(0, 1)]
    n = len(arr)
    printSums(mat, arr, n)
 
# This code is contributed by Rituraj Jain


C#
// An efficient C# program to compute
// sum for given array of cell indexes
using System;
 
class GFG
{
static int R = 3;
static int C = 3;
 
// A structure to represent a cell index
public class Cell
{
    public int r; // r is row, varies from 0 to R-1
    public int c; // c is column, varies from 0 to C-1
 
    public Cell(int r, int c)
    {
        this.r = r;
        this.c = c;
    }    
};
 
static void printSums(int [,]mat,
                      Cell []arr, int n)
{
    int sum = 0;
    int []row = new int[R];
    int []col = new int[C];
 
    // Compute sum of all elements,
    // sum of every row and sum every column
    for (int i = 0; i < R; i++)
    {
        for (int j = 0; j < C; j++)
        {
            sum += mat[i, j];
            col[j] += mat[i, j];
            row[i] += mat[i, j];
        }
    }
 
    // Compute the desired sum
    // for all given cell indexes
    for (int i = 0; i < n; i++)
    {
        int ro = arr[i].r, co = arr[i].c;
        Console.WriteLine(sum - row[ro] - col[co] +
                                mat[ro, co]);
    }
}
 
// Driver Code
public static void Main(String[] args)
{
    int [,]mat = {{1, 1, 2},
                  {3, 4, 6},
                  {5, 3, 2}};
    Cell []arr = {new Cell(0, 0),
                  new Cell(1, 1),
                  new Cell(0, 1)};
    int n = arr.Length;
    printSums(mat, arr, n);
}
}
 
// This code is contributed by Rajput-Ji


Javascript


输出:

15
10
16

上述解决方案的时间复杂度为 O(n * R * C),其中 n 是给定单元索引的数量,R x C 是矩阵大小。
一个有效的解决方案可以在 O(R x C + n) 时间内计算所有的和。这个想法是在处理给定的索引数组之前预先计算总和、行和列总和。下面是详细信息
1.计算矩阵之和,称之和。
2. 计算单个行和列的总和。 (行[] 和列[])
3. 对于单元格索引 (i, j),所需的总和将是“sum-row[i] – col[j] + arr[i][j]”
下面是上述想法的实现。

C++

// An efficient C++ program to compute sum for given array of cell indexes
#include
#define R 3
#define C 3
using namespace std;
 
// A structure to represent a cell index
struct Cell
{
    int r; // r is row, varies from 0 to R-1
    int c; // c is column, varies from 0 to C-1
};
 
void printSums(int mat[][C], struct Cell arr[], int n)
{
    int sum = 0;
    int row[R] = {};
    int col[C] = {};
 
    // Compute sum of all elements, sum of every row and sum every column
    for (int i=0; i

Java

// An efficient Java program to compute
// sum for given array of cell indexes
class GFG
{
static int R = 3;
static int C = 3;
 
// A structure to represent a cell index
static class Cell
{
    int r; // r is row, varies from 0 to R-1
    int c; // c is column, varies from 0 to C-1
 
    public Cell(int r, int c)
    {
        this.r = r;
        this.c = c;
    }    
};
 
static void printSums(int mat[][],
                       Cell arr[], int n)
{
    int sum = 0;
    int []row = new int[R];
    int []col = new int[C];
 
    // Compute sum of all elements,
    // sum of every row and sum every column
    for (int i = 0; i < R; i++)
    {
        for (int j = 0; j < C; j++)
        {
                sum += mat[i][j];
                col[j] += mat[i][j];
                row[i] += mat[i][j];
        }
    }
 
    // Compute the desired sum
    // for all given cell indexes
    for (int i = 0; i < n; i++)
    {
        int ro = arr[i].r, co = arr[i].c;
        System.out.println(sum - row[ro] - col[co] +
                                 mat[ro][co]);
    }
}
 
// Driver Code
public static void main(String[] args)
{
    int mat[][] = {{1, 1, 2},
                   {3, 4, 6},
                   {5, 3, 2}};
    Cell arr[] = {new Cell(0, 0),
                  new Cell(1, 1),
                  new Cell(0, 1)};
    int n = arr.length;
    printSums(mat, arr, n);
}
}
 
// This code is contributed by Princi Singh

Python3

# Python3 implementation of the approach
 
# A structure to represent a cell index
class Cell:
 
    def __init__(self, r, c):
        self.r = r # r is row, varies from 0 to R-1
        self.c = c # c is column, varies from 0 to C-1
 
# A simple solution to find sums
# for a given array of cell indexes
def printSums(mat, arr, n):
 
    Sum = 0
    row, col = [0] * R, [0] * C
 
    # Compute sum of all elements,
    # sum of every row and sum every column
    for i in range(0, R):
        for j in range(0, C):
            Sum += mat[i][j]
            row[i] += mat[i][j]
            col[j] += mat[i][j]
 
    # Compute the desired sum
    # for all given cell indexes
    for i in range(0, n):
        r0, c0 = arr[i].r, arr[i].c
        print(Sum - row[r0] - col[c0] + mat[r0][c0])
 
# Driver Code
if __name__ == "__main__":
 
    mat = [[1, 1, 2], [3, 4, 6], [5, 3, 2]]
    R = C = 3
    arr = [Cell(0, 0), Cell(1, 1), Cell(0, 1)]
    n = len(arr)
    printSums(mat, arr, n)
 
# This code is contributed by Rituraj Jain

C#

// An efficient C# program to compute
// sum for given array of cell indexes
using System;
 
class GFG
{
static int R = 3;
static int C = 3;
 
// A structure to represent a cell index
public class Cell
{
    public int r; // r is row, varies from 0 to R-1
    public int c; // c is column, varies from 0 to C-1
 
    public Cell(int r, int c)
    {
        this.r = r;
        this.c = c;
    }    
};
 
static void printSums(int [,]mat,
                      Cell []arr, int n)
{
    int sum = 0;
    int []row = new int[R];
    int []col = new int[C];
 
    // Compute sum of all elements,
    // sum of every row and sum every column
    for (int i = 0; i < R; i++)
    {
        for (int j = 0; j < C; j++)
        {
            sum += mat[i, j];
            col[j] += mat[i, j];
            row[i] += mat[i, j];
        }
    }
 
    // Compute the desired sum
    // for all given cell indexes
    for (int i = 0; i < n; i++)
    {
        int ro = arr[i].r, co = arr[i].c;
        Console.WriteLine(sum - row[ro] - col[co] +
                                mat[ro, co]);
    }
}
 
// Driver Code
public static void Main(String[] args)
{
    int [,]mat = {{1, 1, 2},
                  {3, 4, 6},
                  {5, 3, 2}};
    Cell []arr = {new Cell(0, 0),
                  new Cell(1, 1),
                  new Cell(0, 1)};
    int n = arr.Length;
    printSums(mat, arr, n);
}
}
 
// This code is contributed by Rajput-Ji

Javascript


输出:

15
10
16