这是我听过的一个采访问题。您有一系列数组,其中元素是长度为2的数组,在数字行上有起点和终点。可能存在重叠。您需要返回所涵盖的总距离。你怎么解决这个问题?
实施例:
输入:[[3,5], [1,3], [2,4]]
输出:4
我的想法:您需要跟踪覆盖的范围以及值是否在特定范围内。虽然不太确定如何做到这一点?
答案 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