我在尋找有效的方法間隔,用於創建<code>Interval</code>創建一個從整數
Interval - (startIndex [inclusive], endIndex [exclusive])
從
unsorted integer array
。
例如,
Array A - [3, 1, 8, 5, 11, 10, 2]
應導致ordered list
的Interval
ordered-List - [(1, 4), (5, 6), (8, 9), (10, 12)]
在我最初的想法是排序這和掃描從左至右創建理解區間下一個元素不連續。
我們可以使用修改的Interval Tree
概念在線性時間內做到這一點,還是有更好的方法來做到這一點?
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'。 – fge 2015-04-02 07:17:01
如果您必須首先_sort_,那麼您的算法必須至少爲O(n log n)。 – Seelenvirtuose 2015-04-02 07:17:51
那麼我可以實現排序的方式,但這是O(NlgN),我正在尋找線性(或可能更少,但似乎不可能)的東西。我不使用番石榴,但我應該看看Range的實現。我使用apache公共庫,如果在Apache中有任何等價物? – Prakhar 2015-04-02 07:19:55