给定大小为N * M的二进制矩阵arr [] [] ,任务是计算直角三角形的数量,该直角三角形的数量可以通过将包含值1的单元格连接起来以使三角形必须具有其任意两个边来形成平行于矩形的边。
例子:
Input: arr[][] = {{0, 1, 0}, {1, 1, 1}, {0, 1, 0}}
Output: 4
Explanation: Right-angled triangles that can be formed are (a[1][1], a[1][0], a[0][1]), (a[1][1], a[2][1], a[1][0]), (a[1][1], a[1][2], a[0][1]) and (a[1][1], a[1][2], a[2][1])
Input: arr[][] = {{1, 0, 1, 0}, {0, 1, 1, 1}, {1, 0, 1, 0}, {0, 1, 0, 1}}
Output: 16
方法:想法是遍历给定的网格,并在辅助数组row []和col []中分别存储每一行和每一列中存在的1 s的计数。然后,对于网格arr [] []中的每个像元,如果arr [i] [j]为1 ,则可以通过(row [i] – 1)*(col [ j] – 1)每个单元格。请按照以下步骤解决问题:
- 用0初始化数组col []和row [] 。
- 遍历给定的网格并访问每个单元格arr [i] [j] 。
- 如果arr [i] [j]为1 ,则将row [i]和col [j]递增1 。
- 遍历网格后,将变量ans初始化为0 。
- 再次遍历整个网格,现在,如果arr [i] [j]为1,则通过以下方式更新直角三角形的计数:
(row[i] – 1)*(col[j] – 1)
- 遍历后,将ans的值打印为直角三角形的总数。
下面是上述方法的实现:
C++
// C++ program for the above approach
#include
using namespace std;
// Function to count the right-angled
// traingle in the given grid a[][]
int numberOfTriangle(
vector >& a)
{
int N = a.size();
int M = a[0].size();
// Stores the count of 1s for
// each row[] and column[]
int rows[N] = { 0 };
int columns[M] = { 0 };
// Find the number of 1s in
// each of the rows[0, N - 1]
for (int i = 0; i < N; ++i) {
for (int j = 0; j < M; ++j) {
// Increment row[i]
if (a[i][j] == 1) {
rows[i]++;
}
}
}
// Find the number of 1s in
// each of the columns[0, N - 1]
for (int i = 0; i < M; ++i) {
for (int j = 0; j < N; ++j) {
// Increment columns[i]
if (a[j][i] == 1) {
columns[i]++;
}
}
}
// Stores the count of triangles
int answer = 0;
for (int i = 0; i < N; ++i) {
for (int j = 0; j < M; ++j) {
// If current cell has value 1
if (a[i][j] == 1) {
// Update the answer
answer += (rows[i] - 1)
* (columns[j] - 1);
}
}
}
// Return the count
return answer;
}
// Driver Code
int main()
{
// Given grid arr[][]
vector > arr;
arr = { { 1, 0, 1, 0 },
{ 0, 1, 1, 1 },
{ 1, 0, 1, 0 },
{ 0, 1, 0, 1 } };
// Function Call
cout << numberOfTriangle(arr);
return 0;
}
Java
// Java program for the
// above approach
import java.util.*;
class GFG{
// Function to count the right-angled
// traingle in the given grid a[][]
static int numberOfTriangle(int[][] a)
{
int N = a.length;
int M = a[0].length;
// Stores the count of 1s for
// each row[] and column[]
int []rows = new int[N];
int []columns = new int[M];
// Find the number of 1s in
// each of the rows[0, N - 1]
for (int i = 0; i < N; ++i)
{
for (int j = 0; j < M; ++j)
{
// Increment row[i]
if (a[i][j] == 1)
{
rows[i]++;
}
}
}
// Find the number of 1s in
// each of the columns[0, N - 1]
for (int i = 0; i < M; ++i)
{
for (int j = 0; j < N; ++j)
{
// Increment columns[i]
if (a[j][i] == 1)
{
columns[i]++;
}
}
}
// Stores the count
// of triangles
int answer = 0;
for (int i = 0; i < N; i++)
{
for (int j = 0; j < M; ++j)
{
// If current cell
// has value 1
if (a[i][j] == 1)
{
// Update the answer
answer += (rows[i] - 1) *
(columns[j] - 1);
}
}
}
// Return the count
return answer;
}
// Driver Code
public static void main(String[] args)
{
// Given grid arr[][]
int [][]arr = {{1, 0, 1, 0},
{0, 1, 1, 1},
{1, 0, 1, 0},
{0, 1, 0, 1}};
// Function Call
System.out.print(numberOfTriangle(arr));
}
}
// This code is contributed by gauravrajput1
Python3
# Python3 program for the above approach
# Function to count the right-angled
# traingle in the given grid a[][]
def numberOfTriangle(a):
N = len(a)
M = len(a[0])
# Stores the count of 1s for
# each row[] and column[]
rows = [0] * N
columns = [0] * M
# Find the number of 1s in
# each of the rows[0, N - 1]
for i in range(N):
for j in range(M):
# Increment row[i]
if (a[i][j] == 1):
rows[i] += 1
# Find the number of 1s in
# each of the columns[0, N - 1]
for i in range(M):
for j in range(N):
# Increment columns[i]
if (a[j][i] == 1):
columns[i] += 1
# Stores the count of triangles
answer = 0
for i in range(N):
for j in range(M):
# If current cell has value 1
if (a[i][j] == 1):
# Update the answer
answer += ((rows[i] - 1) *
(columns[j] - 1))
# Return the count
return answer
# Driver Code
if __name__ == '__main__':
# Given grid arr
arr = [ [ 1, 0, 1, 0 ],
[ 0, 1, 1, 1 ],
[ 1, 0, 1, 0 ],
[ 0, 1, 0, 1 ] ]
# Function call
print(numberOfTriangle(arr))
# This code is contributed by mohit kumar 29
C#
// C# program for the
// above approach
using System;
class GFG{
// Function to count the right-angled
// traingle in the given grid[,]a
static int numberOfTriangle(int[,] a)
{
int N = a.GetLength(0);
int M = a.GetLength(1);
// Stores the count of 1s for
// each []row and column[]
int []rows = new int[N];
int []columns = new int[M];
// Find the number of 1s in
// each of the rows[0, N - 1]
for(int i = 0; i < N; ++i)
{
for(int j = 0; j < M; ++j)
{
// Increment row[i]
if (a[i, j] == 1)
{
rows[i]++;
}
}
}
// Find the number of 1s in
// each of the columns[0, N - 1]
for(int i = 0; i < M; ++i)
{
for(int j = 0; j < N; ++j)
{
// Increment columns[i]
if (a[j, i] == 1)
{
columns[i]++;
}
}
}
// Stores the count
// of triangles
int answer = 0;
for(int i = 0; i < N; i++)
{
for(int j = 0; j < M; ++j)
{
// If current cell
// has value 1
if (a[i, j] == 1)
{
// Update the answer
answer += (rows[i] - 1) *
(columns[j] - 1);
}
}
}
// Return the count
return answer;
}
// Driver Code
public static void Main(String[] args)
{
// Given grid [,]arr
int [,]arr = { { 1, 0, 1, 0 },
{ 0, 1, 1, 1 },
{ 1, 0, 1, 0 },
{ 0, 1, 0, 1 } };
// Function Call
Console.Write(numberOfTriangle(arr));
}
}
// This code is contributed by Amit Katiyar
Javascript
16
时间复杂度: O(N * M),其中NxM是给定网格的尺寸。
空间复杂度: O(N * M)