我正在寻找创建“Interval”(时间间隔)的有效方法。
应该生成一个由
我的初步想法是对此进行排序,然后从左到右扫描,创建区间,了解下一个元素不连续的地方。
我们能否使用修改过的
PS:我可以接受
提前感谢您。
编辑:由于我的范围在[0:1000]之间,并且每次的元素数量不应超过1000,因此我按照排序的方式进行了处理,但我仍然看到改进的机会。以下是我的代码:
Interval - (startIndex [inclusive], endIndex [exclusive])
从未排序的整数数组中选取。
例如,
Array A - [3, 1, 8, 5, 11, 10, 2]
应该生成一个由
Interval
组成的有序列表
。ordered-List - [(1, 4), (5, 6), (8, 9), (10, 12)]
我的初步想法是对此进行排序,然后从左到右扫描,创建区间,了解下一个元素不连续的地方。
我们能否使用修改过的
区间树
概念以线性时间完成这个过程,或者有更好的方法吗?PS:我可以接受
O(N)
空间复杂度。提前感谢您。
编辑:由于我的范围在[0:1000]之间,并且每次的元素数量不应超过1000,因此我按照排序的方式进行了处理,但我仍然看到改进的机会。以下是我的代码:
private class Interval {
private final int startIndex; // inclusive
private final int endIndex; // exclusive
private Interval(int startIndex, int endIndex) {
Validate.isTrue(startIndex >= 0, "start-index (0-based): " + startIndex + ", is lesser than 0.");
Validate.isTrue(startIndex < endIndex, "start index " + startIndex + ", is out of bound with respect to end index " + endIndex + ".");
Validate.isTrue(endIndex <= numberOfSlides(), "end index " + endIndex + ", points to slide that doesn't exist.");
this.startIndex = startIndex;
this.endIndex = endIndex;
}
private int getRange() {
return this.endIndex - this.startIndex;
}
private int startIndex() {
return this.startIndex;
}
}
private List<Interval> createIntervals(int[] slideIndexes) {
Validate.notNull(slideIndexes, "The array of slide indexes is null!");
Validate.isTrue(slideIndexes.length != 0, "The array of slide indexes is empty!");
final List<Interval> intervals = new ArrayList<>();
Arrays.sort(slideIndexes);
int curStart = slideIndexes[0], lastLink = curStart + 1;
for (int i = 1; i < slideIndexes.length; i++) {
if (slideIndexes[i] == lastLink - 1) { // handles duplicates!
continue;
} else if (slideIndexes[i] != lastLink) {
intervals.add(new Interval(curStart, lastLink));
curStart = slideIndexes[i];
}
lastLink = slideIndexes[i] + 1;
}
intervals.add(new Interval(curStart, lastLink));
return intervals;
}
Range
。 - fgeO(n)
没问题吧?我认为这是最小的复杂度,因为你肯定需要扫描数组。你尝试过扫描空隙吗?也许你应该发一下你的尝试。 - Stefan