logo

Minimalus atstumas, kurį reikia nuvažiuoti, kad būtų galima įveikti visus intervalus

Pateikta daug intervalų kaip diapazonai ir mūsų padėtis. Turime rasti minimalų atstumą, kurį reikia nukeliauti, kad pasiektume tokį tašką, kuris apima visus intervalus vienu metu. 

Pavyzdžiai:  

Input : Intervals = [(0 7) (2 14) (4 6)] Position = 3 Output : 1 We can reach position 4 by travelling distance 1 at which all intervals will be covered. So answer will be 1 Input : Intervals = [(1 2) (2 3) (3 4)] Position = 2 Output : -1 It is not possible to cover all intervals at once at any point Input : Intervals = [(1 2) (2 3) (1 4)] Position = 2 Output : 0 All Intervals are covered at current position only so no need travel and answer will be 0 All above examples are shown in below diagram.

Minimalus atstumas, kurį reikia nuvažiuoti, kad būtų galima įveikti visus intervalus



Šią problemą galime išspręsti koncentruodamiesi tik į galutinius taškus. Kadangi reikalavimas yra aprėpti visus intervalus pasiekus tašką, kad atsakymas egzistuotų, visi intervalai turi dalytis tašku. Net intervalas, kurio pabaigos taškas yra kairėje pusėje, turi sutapti su intervalo dešiniuoju pradžios tašku. 
Pirmiausia randame dešinįjį pradžios tašką ir kairįjį galutinį tašką iš visų intervalų. Tada galime palyginti savo poziciją su šiais taškais, kad gautume rezultatą, kuris paaiškinamas toliau: 

  1. Jei šis dešinysis pradžios taškas yra dešinėje nuo kairiojo galo, tada neįmanoma aprėpti visų intervalų vienu metu. (kaip 2 pavyzdyje)
  2. Jei mūsų padėtis yra viduryje tarp labiausiai dešinės ir kairiosios galo, tada nereikia keliauti ir visus intervalus apims tik esama padėtis (kaip 3 pavyzdyje).
  3. Jei mūsų padėtis yra palikta abiejuose taškuose, tada turime keliauti iki dešiniojo pradinio taško, o jei mūsų padėtis yra dešinėje į abu taškus, tada turime keliauti iki kairiojo galo taško.

Norėdami suprasti šiuos atvejus, žr. aukščiau pateiktą diagramą. Kaip ir pirmame pavyzdyje, didžioji dešinė pradžia yra 4, o kairysis galas yra 6, todėl turime pasiekti 4 iš dabartinės padėties 3, kad padengtume visus intervalus. 

Norėdami geriau suprasti, žr. toliau pateiktą kodą.  

C++
// C++ program to find minimum distance to  // travel to cover all intervals #include    using namespace std; // structure to store an interval struct Interval {  int start end;  Interval(int start int end) : start(start)   end(end)  {} }; // Method returns minimum distance to travel  // to cover all intervals int minDistanceToCoverIntervals(Interval intervals[]   int N int x) {  int rightMostStart = INT_MIN;  int leftMostEnd = INT_MAX;  // looping over all intervals to get right most  // start and left most end  for (int i = 0; i < N; i++)  {  if (rightMostStart < intervals[i].start)  rightMostStart = intervals[i].start;  if (leftMostEnd > intervals[i].end)  leftMostEnd = intervals[i].end;  }    int res;  /* if rightmost start > leftmost end then all   intervals are not aligned and it is not   possible to cover all of them */  if (rightMostStart > leftMostEnd)  res = -1;  // if x is in between rightmoststart and   // leftmostend then no need to travel any distance  else if (rightMostStart <= x && x <= leftMostEnd)  res = 0;    // choose minimum according to current position x   else  res = (x < rightMostStart) ? (rightMostStart - x) :  (x - leftMostEnd);    return res; } // Driver code to test above methods int main() {  int x = 3;  Interval intervals[] = {{0 7} {2 14} {4 6}};  int N = sizeof(intervals) / sizeof(intervals[0]);  int res = minDistanceToCoverIntervals(intervals N x);  if (res == -1)  cout << 'Not Possible to cover all intervalsn';  else  cout << res << endl; } 
Java
// Java program to find minimum distance  // to travel to cover all intervals import java.util.*; class GFG{   // Structure to store an interval static class Interval {  int start end;  Interval(int start int end)  {  this.start = start;  this.end = end;  } }; // Method returns minimum distance to // travel to cover all intervals static int minDistanceToCoverIntervals(Interval intervals[]   int N int x) {  int rightMostStart = Integer.MIN_VALUE;  int leftMostEnd = Integer.MAX_VALUE;    // Looping over all intervals to get   // right most start and left most end  for(int i = 0; i < N; i++)  {  if (rightMostStart < intervals[i].start)  rightMostStart = intervals[i].start;  if (leftMostEnd > intervals[i].end)  leftMostEnd = intervals[i].end;  }    int res;  // If rightmost start > leftmost end then   // all intervals are not aligned and it   // is not possible to cover all of them   if (rightMostStart > leftMostEnd)  res = -1;    // If x is in between rightmoststart and   // leftmostend then no need to travel   // any distance  else if (rightMostStart <= x &&   x <= leftMostEnd)  res = 0;    // Choose minimum according to   // current position x   else  res = (x < rightMostStart) ?  (rightMostStart - x) :  (x - leftMostEnd);    return res; } // Driver code public static void main(String[] args) {  int x = 3;  Interval []intervals = { new Interval(0 7)   new Interval(2 14)  new Interval(4 6) };  int N = intervals.length;  int res = minDistanceToCoverIntervals(  intervals N x);    if (res == -1)  System.out.print('Not Possible to ' +   'cover all intervalsn');  else  System.out.print(res + 'n'); } } // This code is contributed by Rajput-Ji 
Python3
# Python program to find minimum distance to # travel to cover all intervals # Method returns minimum distance to travel # to cover all intervals def minDistanceToCoverIntervals(Intervals N x): rightMostStart = Intervals[0][0] leftMostStart = Intervals[0][1] # looping over all intervals to get right most # start and left most end for curr in Intervals: if rightMostStart < curr[0]: rightMostStart = curr[0] if leftMostStart > curr[1]: leftMostStart = curr[1] # if rightmost start > leftmost end then all # intervals are not aligned and it is not # possible to cover all of them if rightMostStart > leftMostStart: res = -1 # if x is in between rightmoststart and # leftmostend then no need to travel any distance else if rightMostStart <= x and x <= leftMostStart: res = 0 # choose minimum according to current position x else: res = rightMostStart-x if x < rightMostStart else x-leftMostStart return res # Driver code to test above methods Intervals = [[0 7] [2 14] [4 6]] N = len(Intervals) x = 3 res = minDistanceToCoverIntervals(Intervals N x) if res == -1: print('Not Possible to cover all intervals') else: print(res) # This code is contributed by rj13to. 
C#
// C# program to find minimum distance  // to travel to cover all intervals using System; class GFG{   // Structure to store an interval public class Interval {  public int start end;    public Interval(int start int end)  {  this.start = start;  this.end = end;  } }; // Method returns minimum distance to // travel to cover all intervals static int minDistanceToCoverIntervals(  Interval []intervals int N int x) {  int rightMostStart = int.MinValue;  int leftMostEnd = int.MaxValue;    // Looping over all intervals to get   // right most start and left most end  for(int i = 0; i < N; i++)  {  if (rightMostStart < intervals[i].start)  rightMostStart = intervals[i].start;  if (leftMostEnd > intervals[i].end)  leftMostEnd = intervals[i].end;  }    int res;  // If rightmost start > leftmost end then   // all intervals are not aligned and it   // is not possible to cover all of them   if (rightMostStart > leftMostEnd)  res = -1;    // If x is in between rightmoststart and   // leftmostend then no need to travel   // any distance  else if (rightMostStart <= x &&   x <= leftMostEnd)  res = 0;    // Choose minimum according to   // current position x   else  res = (x < rightMostStart) ?  (rightMostStart - x) :  (x - leftMostEnd);    return res; } // Driver code public static void Main(String[] args) {  int x = 3;  Interval []intervals = { new Interval(0 7)   new Interval(2 14)  new Interval(4 6) };  int N = intervals.Length;  int res = minDistanceToCoverIntervals(  intervals N x);    if (res == -1)  Console.Write('Not Possible to ' +   'cover all intervalsn');  else  Console.Write(res + 'n'); } } // This code is contributed by shikhasingrajput  
JavaScript
<script> // JavaScript program to find minimum distance to // travel to cover all intervals // Method returns minimum distance to travel // to cover all intervals function minDistanceToCoverIntervals(Intervals N x){  let rightMostStart = Intervals[0][0]  let leftMostStart = Intervals[0][1]  // looping over all intervals to get right most  // start and left most end  for(let curr of Intervals){  if(rightMostStart < curr[0])  rightMostStart = curr[0]  if(leftMostStart > curr[1])  leftMostStart = curr[1]  }  let res;  // if rightmost start > leftmost end then all  // intervals are not aligned and it is not  // possible to cover all of them  if(rightMostStart > leftMostStart)  res = -1    // if x is in between rightmoststart and  // leftmostend then no need to travel any distance  else if(rightMostStart <= x && x <= leftMostStart)  res = 0    // choose minimum according to current position x  else  res = (x < rightMostStart)?rightMostStart-x : x-leftMostStart  return res } // Driver code to test above methods let Intervals = [[0 7] [2 14] [4 6]] let N = Intervals.length let x = 3 let res = minDistanceToCoverIntervals(Intervals N x) if(res == -1)  document.write('Not Possible to cover all intervals''  
'
) else document.write(res) // This code is contributed by shinjanpatra </script>

Išvestis: 

1

Laiko sudėtingumas: O(N)

Pagalbinė erdvė: O(N)
 

Sukurti viktoriną