当前位置: 首页 > 知识库问答 >
问题:

两个不重叠间隔之间的最大距离

郎增
2023-03-14
Number of intervals 3

Interval 1 : 1 2

Interval 2: 3 5

Interval 3: 6 7
import java.util.*;
 class Checker implements Comparator<ArrayList>{
        public int compare(ArrayList a, ArrayList b){
          int x = (Integer)a.get(0);
          int y = (Integer)b.get(0);
          return x-y;
        }
    }
class OverlappingIntervals {
   
    public static void main(String args[]) {
        Scanner sc = new Scanner(System.in);

        int n = sc.nextInt();

        ArrayList<ArrayList<Integer>> intervals = new ArrayList<ArrayList<Integer>>(n);

        for (int i = 0; i < n; i++) {
            int x = sc.nextInt();
            int y = sc.nextInt();
            intervals.add(new ArrayList<Integer>(Arrays.asList(x, y)));
        }

        int result = overlappingIntervals(n, intervals);

        System.out.println(result);
    }

    static int overlappingIntervals(int n, ArrayList<ArrayList<Integer>> intervals) {
        // System.out.println(intervals);
        Checker check = new Checker();

        Collections.sort(intervals, check);
        int ans = -1;
   
        for(int i = 0; i < n-1;i++){
            for(int j = i+1; j < n;j++){
                int x = (Integer)intervals.get(j).get(0)- intervals.get(i).get(1);
                if(x >= 0){     
                    if(x > ans)
                    ans = Math.max(x,ans);
                }                    
            }
        }
        return ans;            
    }        
}
1<=N<=10^5    
1<=l<=r<=10^6

l和r分别是区间的起点和终点。

共有1个答案

羊慈
2023-03-14

我们可以在O(n)+O(n*log(n))时间和O(n)空间复杂度下使用stack轻松地解决这一问题。这里的思想是合并间隔,然后检查连续间隔之间的对应间隙。

这里有一个简单而经典的方法来解决您的问题,并举例说明:

import java.util.*;
class OverlappingIntervals
{
    public static void main(String args[])
    {
        Scanner sc = new Scanner(System.in);
        //int n = sc.nextInt();
        ArrayList<Interval> intervals = new ArrayList<>();

        intervals.add(new Interval(5, 14));intervals.add(new Interval(6, 9));
        intervals.add(new Interval(8, 17));intervals.add(new Interval(23, 25));
        intervals.add(new Interval(36, 56));intervals.add(new Interval(33, 45));
        intervals.add(new Interval(42, 67));intervals.add(new Interval(50, 69));
        intervals.add(new Interval(81, 95));intervals.add(new Interval(99, 111));

        int result = overlappingIntervals(intervals);
        System.out.println(result); // 82 b/w [5 , 17] & [99 , 111]
    }

    static int overlappingIntervals(ArrayList<Interval> intervals)
    {
        // Sorting all Intervals based on there `start` time
        Collections.sort(intervals, Comparator.comparingInt(a -> a.begin));
        int maxDistance = -1;
        
        Stack<Interval> stack = new Stack<>();
        for (Interval currInterval : intervals)
        {
            // Pushing a non-overlapping Interval
            if (stack.empty() || stack.peek().end < currInterval.begin)
                stack.push(currInterval);
            
            // Merging an overlapping Interval
            if (stack.peek().end < currInterval.end)
                    stack.peek().end = currInterval.end;
        }
        /* Now, Stack will have following merged Intervals:
           [5 , 17] <6> [23 , 25] <8> [33 , 69] <12> [81 , 95] <4> [99 , 111] */

        // Checking the gap b/w consecutive Merged-Intervals :
        Interval rightEnd = stack.pop();
        if (stack.empty()) return -1;
        Interval leftEnd = rightEnd;
        while (!stack.empty())
            leftEnd = stack.pop();
        maxDistance = rightEnd.begin - leftEnd.end;
        return maxDistance;
    }        
}
class Interval
{
    int begin, end;
    Interval(int begin, int end)
    {
        this.begin = begin; this.end = end;
    }
    @Override
    public String toString()
    { return "[" +begin+ " , " +end+ "]"; }
}

/** [5========17]   [23=25]  [33=================================69]        [81===========95]   [99======111]
 *  5-------14      23---25      36-----------------56                      81------------95
 *   6---9                            42----------------------67                                 99------111
 *      8------17             33----------45   50----------------69                                      */

我们甚至可以在不合并间隔的情况下这样做,但我相信这种方法更容易理解。有任何疑问请随时询问。

 类似资料:
  • 我试图找到树中两个节点之间的最大距离。这是我的程序: 程序似乎正在运行;但是没有为一些测试用例显示正确的输出。我采取的方法是: 求根节点的子节点数(我一直认为根节点为0)。 找到每个子树的最大深度(尽可能多的子树,因为有根节点的子节点)。 将每个子树的最大深度存储在中,对其进行排序并打印最后两个值的总和。 有人能指出我程序中的错误吗?

  • 我想用C++实现这样一个算法,但是任何对解决方案的描述都会很有帮助。

  • 给定一个数组arr,求最大abs(i-j),使abs(arr[i]-arr[j]) 经过深思熟虑,我想出了以下算法, 对于每个元素的排序,我们进行二进制搜索的复杂性是O(log n),,。总体时间复杂度为O(nlogn*2*logn),是渐近的O(nlogn)。 这种方法正确吗?是否有可能制定线性时间解决方案?我尝试使用哈希图,但发现很难得出线性解决方案。

  • 问题内容: 问题:给定一组任意时间间隔的时间,将所有重叠的时间间隔合并为一个,然后输出结果,该结果应该只有互斥的时间间隔。为了简单起见,将间隔表示为整数对。例如,让给定的间隔集为{{1,3},{2,4},{5,7},{6,8}}。间隔{1,3}和{2,4}彼此重叠,因此应将它们合并并成为{1,4}。同样,{5,7}和{6,8}应该合并并成为{5,8} 编写一个函数,该函数为给定间隔集生成合并间隔集

  • 在数学上问这个可能更好。是的,但我先试试这里: 假设三角形不是共面的,我知道代表两个三角形之间最小距离的一个点必须位于其中一个三角形的顶点或沿边。对于另一个三角形,它可以位于平面上的任何位置,包括沿边或顶点。 实际上,我不需要最小距离本身——最终,我需要找到的只是三角形是否在彼此的某个epsilon内。 我尝试过的一件事是简单地对曲面进行采样,并应用快速ε测试,以查看一个三角形中的任何点是否在另一