我必须编写代码来获取具有奇数个元素的有序双数组,找到它们之间最短距离的值对,并返回剩余值,这被认为是“奇数”和#39 ;.以下是我编写的代码,它可以正常工作并返回正确的值。
有人可以帮我找一下我用过的算法的时间复杂度吗?我尝试过,但这确实令人困惑。
public static Double findPairs(Double[] data, int i, int j, int k, int count) {
Double oddNumber = -1.;
if ((k < data.length) && (diff(data[i], data[j]) <= diff(data[j], data[k]))) {
data[i] = (-1.);
data[j] = (-1.);
if (k == data.length - 1) {
for (int c = 0; c < data.length; c++) {
if (data[c] != -1.) {
i = c;
break;
}
}
if (i != k) {
for (int c = 0; c < data.length; c++) {
if ((c > i) && (data[c] != -1.)) {
j = c;
break;
}
}
findPairs(data, i, j, k, count + 1);
}
}
else {
for (int c = 0; c < data.length; c++) {
if (data[c] != -1.) {
i = c;
break;
}
}
for (int c = 0; c < data.length; c++) {
if ((c > i) && (data[c] != -1.)) {
j = c;
break;
}
}
for (int c = 0; c < data.length; c++) {
if ((c > j) && (data[c] != -1.)) {
k = c;
break;
}
}
findPairs(data, i, j, k, count + 1);
}
}
else if ((k < data.length) && (diff(data[i], data[j]) > diff(data[j], data[k]))) {
if (k == data.length - 1) {
data[j] = (-1.);
data[k] = (-1.);
}
else {
i = j; j = k;
for (int c = 0; c < data.length; c++) {
if ((c > j) && (data[c] != -1.)) {
k = c;
break;
}
}
findPairs(data, i, j, k, count);
}
}
for (int c = 0; c < data.length; c++) {
if (data[c] != -1) {
oddNumber = data[c];
}
}
return oddNumber;
}
算法:从数组的第一,第二和第三个元素开始。比较第一个和第二个元素以及第二个和第三个元素之间的差异。如果第一个差异小于或等于后者,则将前两个元素设为(-1)。否则,对第二,第三和第四个元素执行相同的操作。继续这个过程。每当第一个差异小于第二个差异时,将相对元素设为(-1)并从数组的开头搜索不是(-1)的元素。从找到的前三个元素开始重复该过程。每当第二个差异小于第一个差异时,将三个中的第一个元素放在一边,然后检查接下来的三个元素。这样做直到你到达阵列的末尾。
答案 0 :(得分:1)
你已经对算法进行了编写并编写了代码的方式,在最坏的情况下,你可以迭代越来越多的列表,因为算法从找到一对到下一个将被设置为-1。因此,最坏情况下的运行时间似乎是O(n ^ 2)。