Find maximum distance between any city and station
Given the number of cities n numbered from 0 to n-1 and the cities in which stations are located, the task is to find the maximum distance between any city and its nearest station. Note that the cities with stations can be given in any order.
Examples:
Input: numOfCities = 6, stations = [1, 4]
Output: 1
Input: numOfCities = 6, stations = [3]
Output: 3
Input: numOfCities = 6, stations = [3, 1]
Output: 2
- The below figure represents the first example containing 6 cities and the cities with stations highlighted with green color. In this case, the farthest cities from their nearest stations are 0, 2, 3, and 5 each at a distance of 1. Hence, the maximum distance is 1.
- In the second example, the farthest city from its nearest station is 0 which is at a distance of 3. Hence, the maximum distance is 3.
- In the third example, the farthest city from its nearest station is 5 which is at a distance of 2. Hence, the maximum distance is 2.
Approach:
There are three possible cases in this problem:
- When the farthest city is between two stations.
- When the farthest city is on the left side of the first station.
- When the farthest city is on the right side of the last station.
Below is the algorithm to solve the above problem:
- Initialize a boolean array of size n (number of cities) with False. Then mark the values of cities with stations as True
- Initialize a variable dist with 0. Initialize another variable maxDist with a value that is equal to the first city with the station (used for case 2).
- Start looping through all the cities one by one.
- If the current city has a station, then assign the maximum of (dist+1)//2 and maxDist to maxDist (used for case 1). Also, assign 0 to dist.
- Else, increment dist.
- In the end, return the maximum of dist and maxDist (used for case 3).
Below is the implementation of the above approach:
C++
#include<bits/stdc++.h>
using namespace std;
int findMaxDistance( int numOfCities, int station[], int n)
{
bool hasStation[numOfCities + 1] = { false };
for ( int city = 0; city < n; city++)
{
hasStation[station[city]] = true ;
}
int dist = 0;
int maxDist = INT_MAX;
for ( int i = 0; i < n; i++)
{
maxDist = min(station[i],maxDist);
}
for ( int city = 0; city < numOfCities; city++)
{
if (hasStation[city] == true )
{
maxDist = max((dist + 1) / 2, maxDist);
dist = 0;
}
else
dist += 1;
}
return max(maxDist, dist);
}
int main()
{
int numOfCities = 6;
int station[] = {3, 1};
int n = sizeof (station)/ sizeof (station[0]);
cout << "Max Distance:" << findMaxDistance(numOfCities,
station, n);
}
|
Java
import java.util.*;
class GFG
{
static int findMaxDistance( int numOfCities,
int station[], int n)
{
boolean hasStation[] = new boolean [numOfCities + 1 ];
for ( int city = 0 ; city < n; city++)
{
hasStation[station[city]] = true ;
}
int dist = 0 ;
int maxDist = Integer.MAX_VALUE;
for ( int i = 0 ; i < n; i++)
{
maxDist = Math.min(station[i],maxDist);
}
for ( int city = 0 ; city < numOfCities; city++)
{
if (hasStation[city] == true )
{
maxDist = Math.max((dist + 1 ) / 2 , maxDist);
dist = 0 ;
}
else
dist += 1 ;
}
return Math.max(maxDist, dist);
}
public static void main(String args[])
{
int numOfCities = 6 ;
int station[] = { 3 , 1 };
int n = station.length;
System.out.println( "Max Distance:" +
findMaxDistance(numOfCities,station, n));
}
}
|
Python
def findMaxDistance(numOfCities, station):
hasStation = [ False ] * numOfCities
for city in station:
hasStation[city] = True
dist, maxDist = 0 , min (station)
for city in range (numOfCities):
if hasStation[city] = = True :
maxDist = max ((dist + 1 ) / / 2 , maxDist)
dist = 0
else :
dist + = 1
return max (maxDist, dist)
numOfCities = 6
station = [ 3 , 1 ]
print ( "Max Distance:" , findMaxDistance(numOfCities, station))
|
C#
using System;
class GFG
{
static int findMaxDistance( int numOfCities,
int []station, int n)
{
bool []hasStation = new bool [numOfCities + 1];
for ( int city = 0; city < n; city++)
{
hasStation[station[city]] = true ;
}
int dist = 0;
int maxDist = int .MaxValue;
for ( int i = 0; i < n; i++)
{
maxDist = Math.Min(station[i],maxDist);
}
for ( int city = 0; city < numOfCities; city++)
{
if (hasStation[city] == true )
{
maxDist = Math.Max((dist + 1) / 2, maxDist);
dist = 0;
}
else
dist += 1;
}
return Math.Max(maxDist, dist);
}
public static void Main(String []args)
{
int numOfCities = 6;
int []station = {3, 1};
int n = station.Length;
Console.WriteLine( "Max Distance:" +
findMaxDistance(numOfCities,station, n));
}
}
|
PHP
<?php
function findMaxDistance( $numOfCities ,
$station , $n )
{
$hasStation = array_fill (0, $numOfCities + 1,
false);
for ( $city = 0; $city < $n ; $city ++)
{
$hasStation [ $station [ $city ]] = true;
}
$dist = 0;
$maxDist = PHP_INT_MAX;
for ( $i = 0; $i < $n ; $i ++)
{
$maxDist = min( $station [ $i ], $maxDist );
}
for ( $city = 0;
$city < $numOfCities ; $city ++)
{
if ( $hasStation [ $city ] == true)
{
$maxDist = max((int)(( $dist + 1) / 2),
$maxDist );
$dist = 0;
}
else
$dist += 1;
}
return max( $maxDist , $dist );
}
$numOfCities = 6;
$station = array (3, 1);
$n = count ( $station );
echo "Max Distance: " .findMaxDistance( $numOfCities ,
$station , $n );
?>
|
Javascript
<script>
function findMaxDistance(numOfCities,station,n)
{
var hasStation = Array(numOfCities+1).fill( false );
for ( var city = 0; city < n; city++)
{
hasStation[station[city]] = true ;
}
var dist = 0;
var maxDist = 1000000000;
for ( var i = 0; i < n; i++)
{
maxDist = Math.min(station[i],maxDist);
}
for ( var city = 0; city < numOfCities; city++)
{
if (hasStation[city] == true )
{
maxDist = Math.max((dist + 1) / 2, maxDist);
dist = 0;
}
else
dist += 1;
}
return Math.max(maxDist, dist);
}
var numOfCities = 6;
var station = [3, 1];
var n = station.length;
document.write( "Max Distance: " + findMaxDistance(numOfCities,
station, n));
</script>
|
Complexity Analysis:
- Time Complexity: O(n)
- Space Complexity: O(n)
Last Updated :
09 Sep, 2022
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...