📜  计算给定间隔所覆盖的点

📅  最后修改于: 2021-05-05 02:09:52             🧑  作者: Mango

考虑一个无限的xy平面。无限的人以向上或+ ve Y的方向在飞机上行走。在x轴上的每个整数点,只有一个人走路。假设平行于x轴存在多个障碍。屏障提供为三个小号

  • X1 –障碍开始的x点
  • X2 –势垒结束的x点。
  • Y –障碍位于Y轴上的点。

计算有多少人会因为障碍而陷入困境。不允许使用多余的空间来跟踪x轴上的不同点。

例子:

Input : barriers[] = {{3 6 2}, {-7 4 3}
Output : 14
The barrier from 3 to 6 blocks 3, 4, 5, 6, 
so 4 persons blocked till now.
The barrier from -7 to 4 blocks -7,-6,-5,-4,-
3, -2, -1, 0, 1, 2, 3, 4. But, 3 and 4 have 
already been blocked.
So, total persons blocked is 14.

询问:Microsoft IDC实习。

一种简单的方法是使用一个很长的数组,将其初始化为零。然后,我们可以遍历每个障碍,将障碍中的那些值标记为1。这将解决障碍重叠的情况。

但是我们不能使用前面提到的另一个数组。因此,我们使用排序和简单的数学运算。步骤如下:

1.按x1(起点)对所有障碍进行排序
2.排序后,有3个案例到达:
……一世。下一个障碍与上一个障碍不重叠。在这种情况下,我们只需添加当前障碍覆盖的点数即可。
……二。下一个障碍部分与前一个障碍重叠。在这一点上,我们添加了当前障碍覆盖的非重叠点。
……III。下一个障碍与之前的障碍完全重叠。在这种情况下,我们只需忽略电流障碍。

下面是上述方法的实现。

// CPP program to find number of people
// that are stopped by barriers
#include 
using namespace std;
  
struct Barrier
{
    int x1, x2, y;
};
  
// Compares two Barriers according to x1 
bool compareBarrier(Barrier b1, Barrier b2)
{
    return (b1.x1 < b2.x1);
}
  
// Returns number of people blocked by
// array of barriers arr[0..n-1]
int countStopped(Barrier arr[], int n)
{
    // Sort barriers according to x1.
    sort(arr, arr+n, compareBarrier);
  
    // End point of previous barrier
    // Initializing with some value
    // smaller than lowest x1.
    int prev_end = arr[0].x1 - 1;
  
    // Traverse through all bariers
    int count = 0;
    for (int i=0; i

输出 :

14

我们可以很容易地注意到,在问题中y并不重要,因此它可能不会被存储。

时间复杂度:O(n Log n)