在排序数组中创建间隔

时间:2017-10-30 16:40:46

标签: java intervals sortedlist

假设我有一个{1, 2, 3, 4, 5, 7, 8, 9, 10, 15, 16, 21, 23, 25, 26}的排序数组。 我想通过以下方式将这些元素放在一起:

1..5
7..10
15..16
21..21
23..23
25..26

实际上我有更大的数据,所以我需要一个运行良好的算法。

我想到的是以下内容: 将数组分成两部分,并通过4个循环遍历数组。一个来自0索引的循环,来自数组中间的2个循环和来自它结尾的1个循环。每个循环都会检查当前和下一个元素的diff是否为1,如果是,则转到下一个元素,否则从前面的元素创建一个间隔,并从下一个元素开始一个新的间隔。

我的问题是,这是一个好方法,还是有更好的方法?请伪或java代码。

3 个答案:

答案 0 :(得分:3)

线性解决方案:

int intervalStart = a[0];
for (int i = 1; i < a.length; ++i) {
    if (a[i] > a[i-1] + 1) {
        outputInterval(intervalStart, a[i-1]);
        intervalStart = a[i];
    }
}
outputInterval(intervalStart, a[a.length-1]);

Runnable版本:https://ideone.com/NZ2Uex

答案 1 :(得分:1)

您可以考虑使用Apache Commons中的IntRange数组来表示这样的概念。

是的,它需要第三方库,但毕竟是Apache Commons。

答案 2 :(得分:1)

您正在尝试获取连续整数列表。

O(n)中最简单,最天真的方式是做这样的事情:

List<List<Integer>> list_of_sublists = new List<>(); // The list of sublists
int lastElement = elements[0];
List<Integer> subList = new List <>(); // The current sublist
subList.add(lastElement);
int i = 1; // We start with index 1 because index 0 is already done
while (i < elements.length){
   int element = elements[i]
   if !(lastElement + 1 == element)){ //If not a consecutive we start a new list
       list_of_sublists.add(subList);
       subList = new List<>();
   }
   lastElement = element;
   subList.add(element);
   i ++;

//We didn't add the last sublist
list_of_sublists.add(subList);
return list_of_sublists;

您可以通过获取间隔和每个间隔复制后续动作轻松适应arrays