给定一系列范围可以找到覆盖的总距离?

时间:2016-04-19 04:10:37

标签: arrays algorithm

这是我听过的一个采访问题。您有一系列数组,其中元素是长度为2的数组,在数字行上有起点和终点。可能存在重叠。您需要返回所涵盖的总距离。你怎么解决这个问题?

实施例: 输入:[[3,5], [1,3], [2,4]] 输出:4

我的想法:您需要跟踪覆盖的范围以及值是否在特定范围内。虽然不太确定如何做到这一点?

3 个答案:

答案 0 :(得分:3)

你需要合并你的起始间隔,一旦它们被合并,只需计算总距离作为每个间隔所涵盖距离的总和。

您可以合并O(n * log n)中的间隔,其中n是间隔数。为此,您可以根据第一个点/秒点对它们进行排序。现在,您遍历已排序的时间间隔并检查应合并的时间间隔。要了解它们为何以及如何合并,请绘制如下内容:

a---------------------b
            c-------------------d

并注意合并间隔的相似性。提示max(a,c) > min(b,d)

P.S。如果您想通过面试,那么更多地考虑这个问题是有意义的。

答案 1 :(得分:2)

这是我的实施 由于每个范围都有最小值和最大值(| min | ------ | max |) 如果您有排序列表,则可以通过从上一个最大值减去当前最小值来找到未覆盖的距离。如果该值为负,则您知道两个范围之间没有差异。因此,您不必包含该范围,只需存储新的最大值。

import java.util.ArrayList;
import java.util.HashMap;

public class Main {
    public static void main(String[] args) {
        //GIVEN A SORTED ARRAY BY THE INDEX AT 0 
        // (equal array[0] is then sorted by array[1].
        //If array isn't sorted you sort it here

        ArrayList<int[]> ranges = new ArrayList<>();
        ranges.add(new int[]{1,3});
        ranges.add(new int[]{2,4});
        ranges.add(new int[]{3,5});

        //getSortedArray(ranges);  //not implemented here

        int min = ranges.get(0)[0];
        int totalDifference = 0;
        int lastMax = 0;

        int MAX = 0;
        for(int i = 0; i < ranges.size(); i++){
            if(i == 0){
                //the highest max is the current index at 1
                lastMax = ranges.get(i)[1]; 
            }else{
                int tempMin = ranges.get(i)[0];
                int diff = (tempMin - lastMax);
                //Only if the range is above the last range.  
                // A negative means there is no difference.
                if(diff > 0) {
                    //Subtract the new min of the range from the last max
                    // This gives you the distance between ranges.
                    totalDifference += diff;
                }
                lastMax = ranges.get(i)[1];   // Set the new last max
            }
            MAX = ranges.get(i)[1];
        }
        System.out.println("Total Distance = " + (MAX - min - totalDifference));
    }
}

答案 2 :(得分:0)

这就是我解决它的方法(排序)

def total_distance(intervals)
  distance = 0
  max_value = nil
  intervals.each do |array|
    if max_value.nil?
      distance += array[1] - array[0]
      max_value = array[1]
    elsif array[0] < max_value && array[1] < max_value
      next
    elsif array[0] < max_value && array[1] > max_value
      distance += array[1] - max_value
      max_value = array[1]
    elsif array[0] > max_value
      distance += array[1] - array[0]
      max_value = array[1]
    end
  end
  distance
end

p total_distance([[1,5], [2,3], [4,8]]) == 7
p total_distance([[1,2], [3,4], [5,6]]) == 3