假设我有一个{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代码。
答案 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
。