给定两个表示网格尺寸的整数L和W ,以及两个长度为N 的数组X[]和Y[] ,表示网格上位置(X[i], Y[i])处的塔的数量,其中(0 <= i <= N – 1)。任务是在场中找到最大的不受塔保护的无界区域。
例子:
Input: L = 15, W = 8, N = 3 X[] = {3, 11, 8} Y[] = {8, 2, 6}
Output: 12
Explanation:
The coordinates of the towers are (3, 8), (11, 2) and (8, 6).
Observe that the largest area of the grid which is not guarded by any of the towers is within the cells (4, 3), (7, 3), (7, 5) and (4, 5). Hence, the area for that part is 12.
Input: L = 3, W = 3, N = 1 X[] = {1} Y[] = {1}
Output: 4
Explanation:
Observe that the largest area of the grid which is not guarded by any of the towers is 4.
朴素的方法:按照以下步骤解决问题:
- 用0初始化一个维度为L * W的矩阵。
- 横动X []和Y [],并且为每一个(X [I],Y [1])中,标记在X所有细胞[I]第i行的Y [i]列由1,以表示正在把守在(X[i], Y[i])的塔旁。
- 然后遍历矩阵和对于每个单元格,找到最大的未被保护的子矩阵,即由0组成的最大子矩阵。打印相应的区域。
时间复杂度: O(N 3 )
辅助空间: O(N 2 )
高效方法:可以使用以下贪婪技术优化上述方法:
- 对坐标列表X[]和Y[] 进行排序。
- 计算 x 坐标之间的空格,即dX[] = {X 1 , X 2 – X 1 , …., X N – X (N-1) , (L+1) – X N } 。类似地,计算 y 坐标之间的空间, dY[] = {Y 1 , Y 2 – Y 1 , …., Y N – Y (N-1) , (W + 1) – Y N } 。
- 遍历dX[]和dY[]并计算它们各自的最大值。
- 计算它们的最大值的乘积并将其打印为所需的最长无界区域。
下面是上述方法的实现:
C++
// C++ Program for the above approach
#include
#include
using namespace std;
// Function to calculate the largest
// area unguarded by towers
void maxArea(int point_x[], int point_y[], int n,
int length, int width)
{
// Sort the x-coordinates of the list
sort(point_x, point_x + n);
// Sort the y-coordinates of the list
sort(point_y, point_y + n);
// dx --> maximum uncovered
// tiles in x coordinates
int dx = point_x[0];
// dy --> maximum uncovered
// tiles in y coordinates
int dy = point_y[0];
// Calculate the maximum uncovered
// distances for both x and y coordinates
for (int i = 1; i < n; i++) {
dx = max(dx, point_x[i]
- point_x[i - 1]);
dy = max(dy, point_y[i]
- point_y[i - 1]);
}
dx = max(dx, (length + 1)
- point_x[n - 1]);
dy = max(dy, (width + 1)
- point_y[n - 1]);
// Largest unguarded area is
// max(dx)-1 * max(dy)-1
cout << (dx - 1) * (dy - 1);
cout << endl;
}
// Driver Code
int main()
{
// Length and width of the grid
int length = 15, width = 8;
// No of guard towers
int n = 3;
// Array to store the x and
// y coordinates
int point_x[] = { 3, 11, 8 };
int point_y[] = { 8, 2, 6 };
// Function call
maxArea(point_x, point_y,
n, length, width);
return 0;
}
Java
// Java program for the above approach
import java.io.*;
import java.util.*;
class GFG{
// Function to calculate the largest
// area unguarded by towers
static void maxArea(int[] point_x, int[] point_y,
int n, int length, int width)
{
// Sort the x-coordinates of the list
Arrays.sort(point_x);
// Sort the y-coordinates of the list
Arrays.sort(point_y);
// dx --> maximum uncovered
// tiles in x coordinates
int dx = point_x[0];
// dy --> maximum uncovered
// tiles in y coordinates
int dy = point_y[0];
// Calculate the maximum uncovered
// distances for both x and y coordinates
for(int i = 1; i < n; i++)
{
dx = Math.max(dx, point_x[i] -
point_x[i - 1]);
dy = Math.max(dy, point_y[i] -
point_y[i - 1]);
}
dx = Math.max(dx, (length + 1) -
point_x[n - 1]);
dy = Math.max(dy, (width + 1) -
point_y[n - 1]);
// Largest unguarded area is
// max(dx)-1 * max(dy)-1
System.out.println((dx - 1) * (dy - 1));
}
// Driver Code
public static void main(String[] args)
{
// Length and width of the grid
int length = 15, width = 8;
// No of guard towers
int n = 3;
// Array to store the x and
// y coordinates
int point_x[] = { 3, 11, 8 };
int point_y[] = { 8, 2, 6 };
// Function call
maxArea(point_x, point_y, n,
length, width);
}
}
// This code is contributed by akhilsaini
Python3
# Python3 program for the above approach
# Function to calculate the largest
# area unguarded by towers
def maxArea(point_x, point_y, n,
length, width):
# Sort the x-coordinates of the list
point_x.sort()
# Sort the y-coordinates of the list
point_y.sort()
# dx --> maximum uncovered
# tiles in x coordinates
dx = point_x[0]
# dy --> maximum uncovered
# tiles in y coordinates
dy = point_y[0]
# Calculate the maximum uncovered
# distances for both x and y coordinates
for i in range(1, n):
dx = max(dx, point_x[i] -
point_x[i - 1])
dy = max(dy, point_y[i] -
point_y[i - 1])
dx = max(dx, (length + 1) -
point_x[n - 1])
dy = max(dy, (width + 1) -
point_y[n - 1])
# Largest unguarded area is
# max(dx)-1 * max(dy)-1
print((dx - 1) * (dy - 1))
# Driver Code
if __name__ == "__main__":
# Length and width of the grid
length = 15
width = 8
# No of guard towers
n = 3
# Array to store the x and
# y coordinates
point_x = [ 3, 11, 8 ]
point_y = [ 8, 2, 6 ]
# Function call
maxArea(point_x, point_y, n,
length, width)
# This code is contributed by akhilsaini
C#
// C# Program for the above approach
using System;
class GFG{
// Function to calculate the largest
// area unguarded by towers
static void maxArea(int[] point_x, int[] point_y,
int n, int length, int width)
{
// Sort the x-coordinates of the list
Array.Sort(point_x);
// Sort the y-coordinates of the list
Array.Sort(point_y);
// dx --> maximum uncovered
// tiles in x coordinates
int dx = point_x[0];
// dy --> maximum uncovered
// tiles in y coordinates
int dy = point_y[0];
// Calculate the maximum uncovered
// distances for both x and y coordinates
for(int i = 1; i < n; i++)
{
dx = Math.Max(dx, point_x[i] -
point_x[i - 1]);
dy = Math.Max(dy, point_y[i] -
point_y[i - 1]);
}
dx = Math.Max(dx, (length + 1) -
point_x[n - 1]);
dy = Math.Max(dy, (width + 1) -
point_y[n - 1]);
// Largest unguarded area is
// max(dx)-1 * max(dy)-1
Console.WriteLine((dx - 1) * (dy - 1));
}
// Driver Code
static public void Main()
{
// Length and width of the grid
int length = 15, width = 8;
// No of guard towers
int n = 3;
// Array to store the x and
// y coordinates
int[] point_x = { 3, 11, 8 };
int[] point_y = { 8, 2, 6 };
// Function call
maxArea(point_x, point_y, n,
length, width);
}
}
// This code is contributed by akhilsaini
Javascript
12
时间复杂度: (N * log N)
辅助空间: O(1)
如果您想与行业专家一起参加直播课程,请参阅Geeks Classes Live