Largest area in a grid unbounded by towers
Last Updated :
18 May, 2021
Given two integers L and W representing the dimensions of a grid, and two arrays X[] and Y[] of length N denoting the number of towers present on the grid at positions (X[i], Y[i]), where (0 <= i <= N – 1). The task is to find the largest unbounded area in the field which is not defended by the towers.
Examples:
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.
Naive Approach: Follow the steps below to solve the problem:
- Initialize a matrix of dimensions L * W with 0s.
- Traverse X[] and Y[], and for every (X[i], Y[i]), mark all the cells in the X[i]th Row and Y[i]th Column by 1, to denote being guarded by the tower at (X[i], Y[i]).
- Then traverse the matrix and for each cell, and find the largest sub-matrix which is left unguarded, i.e. largest submatrix consisting of 0s. Print the corresponding area.
Time Complexity: O(N3)
Auxiliary Space: O(N2)
Efficient Approach: The above approach can be optimized using the following Greedy technique:
- Sort both the lists of co-ordinates X[] and Y[].
- Calculate the empty spaces between the x co-ordinates, i.e. dX[] = {X1, X2 – X1, …., XN – X(N-1), (L+1) – XN }. Similarly, calculate the spaces between y co-ordinates, dY[] = {Y1, Y2 – Y1, …., YN – Y(N-1), (W + 1) – YN }.
- Traverse dX[] and dY[] and calculate their respective maximums.
- Calculate the product of their maximums and print it as the required longest unbounded area.
Below is the implementation of the above approach:
C++
#include <algorithm>
#include <iostream>
using namespace std;
void maxArea( int point_x[], int point_y[], int n,
int length, int width)
{
sort(point_x, point_x + n);
sort(point_y, point_y + n);
int dx = point_x[0];
int dy = point_y[0];
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]);
cout << (dx - 1) * (dy - 1);
cout << endl;
}
int main()
{
int length = 15, width = 8;
int n = 3;
int point_x[] = { 3, 11, 8 };
int point_y[] = { 8, 2, 6 };
maxArea(point_x, point_y,
n, length, width);
return 0;
}
|
Java
import java.io.*;
import java.util.*;
class GFG{
static void maxArea( int [] point_x, int [] point_y,
int n, int length, int width)
{
Arrays.sort(point_x);
Arrays.sort(point_y);
int dx = point_x[ 0 ];
int dy = point_y[ 0 ];
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 ]);
System.out.println((dx - 1 ) * (dy - 1 ));
}
public static void main(String[] args)
{
int length = 15 , width = 8 ;
int n = 3 ;
int point_x[] = { 3 , 11 , 8 };
int point_y[] = { 8 , 2 , 6 };
maxArea(point_x, point_y, n,
length, width);
}
}
|
Python3
def maxArea(point_x, point_y, n,
length, width):
point_x.sort()
point_y.sort()
dx = point_x[ 0 ]
dy = point_y[ 0 ]
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 ])
print ((dx - 1 ) * (dy - 1 ))
if __name__ = = "__main__" :
length = 15
width = 8
n = 3
point_x = [ 3 , 11 , 8 ]
point_y = [ 8 , 2 , 6 ]
maxArea(point_x, point_y, n,
length, width)
|
C#
using System;
class GFG{
static void maxArea( int [] point_x, int [] point_y,
int n, int length, int width)
{
Array.Sort(point_x);
Array.Sort(point_y);
int dx = point_x[0];
int dy = point_y[0];
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]);
Console.WriteLine((dx - 1) * (dy - 1));
}
static public void Main()
{
int length = 15, width = 8;
int n = 3;
int [] point_x = { 3, 11, 8 };
int [] point_y = { 8, 2, 6 };
maxArea(point_x, point_y, n,
length, width);
}
}
|
Javascript
<script>
function maxArea(polet_x, polet_y,
n, length, width)
{
polet_x.sort((a, b) => a - b);;
polet_y.sort((a, b) => a - b);;
let dx = polet_x[0];
let dy = polet_y[0];
for (let i = 1; i < n; i++)
{
dx = Math.max(dx, polet_x[i] -
polet_x[i - 1]);
dy = Math.max(dy, polet_y[i] -
polet_y[i - 1]);
}
dx = Math.max(dx, (length + 1) -
polet_x[n - 1]);
dy = Math.max(dy, (width + 1) -
polet_y[n - 1]);
document.write((dx - 1) * (dy - 1));
}
let length = 15, width = 8;
let n = 3;
let polet_x = [ 3, 11, 8 ];
let polet_y = [ 8, 2, 6 ];
maxArea(polet_x, polet_y, n,
length, width);
</script>
|
Time Complexity: (N * log N)
Auxiliary Space: O(1)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...