📜  正方形矩阵的非对角线部分的总和

📅  最后修改于: 2021-04-22 02:22:16             🧑  作者: Mango

给定大小为NXN的正方形矩阵,当矩阵沿对角线分为四个部分时,任务是找到每个部分上所有元素的总和。对角线上的元素不应计入总和。
例子:

方法:想法是使用索引来识别对角线上的元素。

  1. 在二维矩阵中,以以下方式标识两个对角线:
    1. 主对角线:第一个对角线的行索引等于列索引。
Condition for Principal Diagonal:
The row-column condition is row = column.
  1. 次要对角线:第二个对角线的行和列的索引之和等于N(矩阵的大小)。
Condition for Secondary Diagonal:
The row-column condition is row = numberOfRows - column -1
  1. 在标识了两个对角线之后,可以使用穿过最后一行的第一个元素和第一行的最后一个元素的对角线将矩阵进一步分为两部分:
    1. 左侧部分:
      • 如果列索引大于行索引,则该元素属于矩阵的顶部
      • 如果行索引大于列索引,则该元素属于矩阵的左侧
    2. 正确的部分:
      • 如果列索引大于行索引,则该元素属于矩阵的右侧
      • 如果行索引大于列索引,则该元素属于矩阵的底部

  1. 因此,为了获得矩阵的非对角线部分的和:
    • 逐行遍历矩阵
    • 如果该元素是对角线的一部分,则跳过此元素
    • 如果元素是左侧,右侧,底部或顶部(即非对角线部分)的一部分,则将该元素加到所得的总和中

下面是上述方法的实现:

C++
// C++ implementation of the above approach
 
#include 
using namespace std;
 
// Function to return a vector which
// consists the sum of
// four portions of the matrix
int sumOfParts(int* arr, int N)
{
    int sum_part1 = 0, sum_part2 = 0,
        sum_part3 = 0, sum_part4 = 0;
    int totalsum = 0;
 
    // Iterating through the matrix
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
 
            // Condition for selecting all values
            // before the second diagonal of metrics
            if (i + j < N - 1) {
 
                // Top portion of the matrix
                if (i < j and i != j and i + j)
                    sum_part1 += (arr + i * N)[j];
 
                // Left portion of the matrix
                else if (i != j)
                    sum_part2 += (arr + i * N)[j];
            }
            else {
 
                // Bottom portion of the matrix
                if (i > j and i + j != N - 1)
                    sum_part3 += (arr + i * N)[j];
 
                // Right portion of the matrix
                else {
                    if (i + j != N - 1 and i != j)
                        sum_part4 += (arr + i * N)[j];
                }
            }
        }
    }
 
    // Adding all the four portions into a vector
    totalsum = sum_part1 + sum_part2
               + sum_part3 + sum_part4;
    return totalsum;
}
 
// Driver code
int main()
{
    int N = 4;
    int arr[N][N] = { { 1, 2, 3, 4 },
                      { 5, 6, 7, 8 },
                      { 9, 10, 11, 12 },
                      { 13, 14, 15, 16 } };
 
    cout << sumOfParts((int*)arr, N);
}


Java
// Java implementation of the above approach
class GFG
{
  
// Function to return a vector which
// consists the sum of
// four portions of the matrix
static int sumOfParts(int[][] arr, int N)
{
    int sum_part1 = 0, sum_part2 = 0,
        sum_part3 = 0, sum_part4 = 0;
    int totalsum = 0;
  
    // Iterating through the matrix
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
  
            // Condition for selecting all values
            // before the second diagonal of metrics
            if (i + j < N - 1) {
  
                // Top portion of the matrix
                if (i < j && i != j && i + j > 0)
                    sum_part1 += arr[i][j];
  
                // Left portion of the matrix
                else if (i != j)
                    sum_part2 += arr[i][j];
            }
            else {
  
                // Bottom portion of the matrix
                if (i > j && i + j != N - 1)
                    sum_part3 += arr[i][j];
  
                // Right portion of the matrix
                else {
                    if (i + j != N - 1 && i != j)
                        sum_part4 += arr[i][j];
                }
            }
        }
    }
  
    // Adding all the four portions into a vector
    totalsum = sum_part1 + sum_part2
               + sum_part3 + sum_part4;
    return totalsum;
}
  
// Driver code
public static void main(String[] args)
{
    int N = 4;
    int arr[][] = { { 1, 2, 3, 4 },
                      { 5, 6, 7, 8 },
                      { 9, 10, 11, 12 },
                      { 13, 14, 15, 16 } };
  
    System.out.print(sumOfParts(arr, N));
}
}
 
// This code is contributed by PrinciRaj1992


Python3
# Python3 implementation of the above approach
 
# Function to return a vector which
# consists the sum of
# four portions of the matrix
def sumOfParts(arr,N):
    sum_part1, sum_part2, sum_part3, \
    sum_part4 = 0, 0, 0, 0
    totalsum = 0
 
    # Iterating through the matrix
    for i in range(N):
        for j in range(N):
             
            # Condition for selecting all values
            # before the second diagonal of metrics
            if i + j < N - 1:
                 
                # Top portion of the matrix
                if(i < j and i != j and i + j):
                    sum_part1 += arr[i][j]
                 
                # Left portion of the matrix
                elif i != j:
                    sum_part2 += arr[i][j]
            else:
                 
                # Bottom portion of the matrix
                if i > j and i + j != N - 1:
                    sum_part3 += arr[i][j]
                else:
                     
                # Right portion of the matrix
                    if i + j != N - 1 and i != j:
                        sum_part4 += arr[i][j]
        # Adding all the four portions into a vecto
    return sum_part1 + sum_part2 + sum_part3 + sum_part4
 
# Driver code
N = 4
arr = [[ 1, 2, 3, 4 ],
       [ 5, 6, 7, 8 ],
       [ 9, 10, 11, 12 ],
       [ 13, 14, 15, 16 ]]
 
print(sumOfParts(arr, N))
 
# This code is contributed by mohit kumar 29


C#
// C# implementation of the above approach
using System;
 
class GFG
{
  
    // Function to return a vector which
    // consists the sum of
    // four portions of the matrix
    static int sumOfParts(int[,] arr, int N)
    {
        int sum_part1 = 0, sum_part2 = 0,
            sum_part3 = 0, sum_part4 = 0;
        int totalsum = 0;
      
        // Iterating through the matrix
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
      
                // Condition for selecting all values
                // before the second diagonal of metrics
                if (i + j < N - 1) {
      
                    // Top portion of the matrix
                    if (i < j && i != j && i + j > 0)
                        sum_part1 += arr[i, j];
      
                    // Left portion of the matrix
                    else if (i != j)
                        sum_part2 += arr[i, j];
                }
                else {
      
                    // Bottom portion of the matrix
                    if (i > j && i + j != N - 1)
                        sum_part3 += arr[i, j];
      
                    // Right portion of the matrix
                    else {
                        if (i + j != N - 1 && i != j)
                            sum_part4 += arr[i, j];
                    }
                }
            }
        }
      
        // Adding all the four portions into a vector
        totalsum = sum_part1 + sum_part2
                   + sum_part3 + sum_part4;
        return totalsum;
    }
      
    // Driver code
    public static void Main()
    {
        int N = 4;
        int [,]arr = { { 1, 2, 3, 4 },
                          { 5, 6, 7, 8 },
                          { 9, 10, 11, 12 },
                          { 13, 14, 15, 16 } };
      
        Console.WriteLine(sumOfParts(arr, N));
    }
}
 
// This code is contributed by Yash_R


Javascript


输出:
68

时间复杂度: O(N 2 ),因为我们正在逐行遍历整个矩阵。