给定大小为NXN的二维正方形矩阵,任务是计算矩阵中的山脉数量。
An element in a matrix is said to be a mountain when all the surrounding elements (in all 8 directions) are smaller than the given element.
例子:
Input: matrix =
{ { 4, 5, 6 },
{ 2, 1, 3 },
{ 7, 8, 9 } }
Output: 1
Explanation
Only mountain element = 9.
All the neighbouring elements
1, 3 and 8 are smaller than 9.
Input: matrix =
{ { 7, 8, 9 },
{ 1, 2, 3 },
{ 4, 5, 6 } }
Output: 2
Explanation
Mountain elements = 6 (2, 3 and 5)
and 9 (8, 2, and 3)
方法:想法是遍历矩阵,同时检查所有可能的8个方向上的相邻元素。如果该元素大于所有元素,则增加计数器变量。最后,返回柜台。
- 创建大小为(N + 2)X(N + 2)的辅助数组。
- 用INT_MIN值填充所有边框元素
- 在NXN的剩余阵列空间中,复制原始矩阵
- 现在检查一个元素是否在所有8个方向上都大于该元素。
- 计算此类元素的数量并进行打印。
例如:
If matrix =
{ { 7, 8, 9 },
{ 1, 2, 3 },
{ 4, 5, 6 } }
The auxiliary array would be
{ { 0, 0, 0, 0, 0 },
{ 0, 7, 8, 9, 0 },
{ 0, 1, 2, 3, 0 },
{ 0, 4, 5, 6, 0 },
{ 0, 0, 0, 0, 0 } }
下面是上述方法的实现:
C++
// C++ program find the count of
// mountains in a given Matrix
#include
using namespace std;
const int MAX = 100;
// Function to count number of mountains
// in a given matrix of size n
int countMountains(int a[][MAX], int n)
{
int A[n + 2][n + 2];
int count = 0;
// form another matrix with one extra
// layer of border elements. Border
// elements will contain INT_MIN value.
for (int i = 0; i < n + 2; i++) {
for (int j = 0; j < n + 2; j++) {
if ((i == 0) || (j == 0)
|| (i == n + 1)
|| (j == n + 1)) {
// For border elements,
// set value as INT_MIN
A[i][j] = INT_MIN;
}
else {
// For rest elements, just copy
// it into new matrix
A[i][j] = a[i - 1][j - 1];
}
}
}
// Check for mountains in the modified matrix
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
// check for all directions
if ((A[i][j] > A[i - 1][j])
&& (A[i][j] > A[i + 1][j])
&& (A[i][j] > A[i][j - 1])
&& (A[i][j] > A[i][j + 1])
&& (A[i][j] > A[i - 1][j - 1])
&& (A[i][j] > A[i + 1][j + 1])
&& (A[i][j] > A[i - 1][j + 1])
&& (A[i][j] > A[i + 1][j - 1])) {
count++;
}
}
}
return count;
}
// Driver code
int main()
{
int a[][MAX] = { { 1, 2, 3 },
{ 4, 5, 6 },
{ 7, 8, 9 } };
int n = 3;
cout << countMountains(a, n);
return 0;
}
Java
// Java program find the count of
// mountains in a given Matrix
import java.util.*;
class GFG{
static int MAX = 100;
// Function to count number of mountains
// in a given matrix of size n
static int countMountains(int a[][], int n)
{
int [][]A = new int[n + 2][n + 2];
int count = 0;
// form another matrix with one extra
// layer of border elements. Border
// elements will contain Integer.MIN_VALUE value.
for (int i = 0; i < n + 2; i++) {
for (int j = 0; j < n + 2; j++) {
if ((i == 0) || (j == 0)
|| (i == n + 1)
|| (j == n + 1)) {
// For border elements,
// set value as Integer.MIN_VALUE
A[i][j] = Integer.MIN_VALUE;
}
else {
// For rest elements, just copy
// it into new matrix
A[i][j] = a[i - 1][j - 1];
}
}
}
// Check for mountains in the modified matrix
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
// check for all directions
if ((A[i][j] > A[i - 1][j])
&& (A[i][j] > A[i + 1][j])
&& (A[i][j] > A[i][j - 1])
&& (A[i][j] > A[i][j + 1])
&& (A[i][j] > A[i - 1][j - 1])
&& (A[i][j] > A[i + 1][j + 1])
&& (A[i][j] > A[i - 1][j + 1])
&& (A[i][j] > A[i + 1][j - 1])) {
count++;
}
}
}
return count;
}
// Driver code
public static void main(String[] args)
{
int a[][] = { { 1, 2, 3 },
{ 4, 5, 6 },
{ 7, 8, 9 } };
int n = 3;
System.out.print(countMountains(a, n));
}
}
// This code is contributed by sapnasingh4991
Python3
# Python3 program find the count of
# mountains in a given Matrix
MAX = 100
# Function to count number of mountains
# in a given matrix of size n
def countMountains(a, n):
A = [[0 for i in range(n+2)] for i in range(n+2)]
count = 0
# form another matrix with one extra
# layer of border elements. Border
# elements will contain INT_MIN value.
for i in range(n+2):
for j in range(n+2):
if ((i == 0) or (j == 0) or
(i == n + 1) or (j == n + 1)):
# For border elements,
# set value as INT_MIN
A[i][j] = float('-inf')
else:
# For rest elements, just copy
# it into new matrix
A[i][j] = a[i - 1][j - 1]
# Check for mountains in the modified matrix
for i in range(n + 1):
for j in range(n + 1):
if ((A[i][j] > A[i - 1][j]) and
(A[i][j] > A[i + 1][j]) and
(A[i][j] > A[i][j - 1]) and
(A[i][j] > A[i][j + 1]) and
(A[i][j] > A[i - 1][j - 1]) and
(A[i][j] > A[i + 1][j + 1]) and
(A[i][j] > A[i - 1][j + 1]) and
(A[i][j] > A[i + 1][j - 1])):
count = count + 1
return count
# Driver code
a = [ [ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ] ]
n = 3
print(countMountains(a, n))
# This code is contributed by Sanjit_Prasad
C#
// C# program find the count of
// mountains in a given Matrix
using System;
class GFG{
static int MAX = 100;
// Function to count number of mountains
// in a given matrix of size n
static int countMountains(int [,]a, int n)
{
int [,]A = new int[n + 2,n + 2];
int count = 0;
// form another matrix with one extra
// layer of border elements. Border
// elements will contain Integer.MIN_VALUE value.
for (int i = 0; i < n + 2; i++) {
for (int j = 0; j < n + 2; j++) {
if ((i == 0) || (j == 0)
|| (i == n + 1)
|| (j == n + 1)) {
// For border elements,
// set value as Integer.MIN_VALUE
A[i,j] = int.MinValue;
}
else {
// For rest elements, just copy
// it into new matrix
A[i,j] = a[i - 1,j - 1];
}
}
}
// Check for mountains in the modified matrix
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
// check for all directions
if ((A[i,j] > A[i - 1,j])
&& (A[i,j] > A[i + 1,j])
&& (A[i,j] > A[i,j - 1])
&& (A[i,j] > A[i,j + 1])
&& (A[i,j] > A[i - 1,j - 1])
&& (A[i,j] > A[i + 1,j + 1])
&& (A[i,j] > A[i - 1,j + 1])
&& (A[i,j] > A[i + 1,j - 1])) {
count++;
}
}
}
return count;
}
// Driver code
public static void Main(string[] args)
{
int [,]a = { { 1, 2, 3 },
{ 4, 5, 6 },
{ 7, 8, 9 } };
int n = 3;
Console.WriteLine(countMountains(a, n));
}
}
// This code is contributed by AnkitRai01
输出:
1
绩效分析:
- 时间复杂度:在上述方法中,我们进行了两次迭代。第一个是在(N + 2)X(N + 2)个元素上创建辅助矩阵。第二个在NXN元素上查找实际的山元素,因此时间复杂度为O(NXN) 。
- 辅助空间复杂度:在上述方法中,我们使用大小为(N + 2)X(N + 2)的辅助矩阵,因此辅助空间复杂度为O(N * N) 。