以下是有关算法/解决方案的说明:
然后:
for each remaining element {
if (if it is smaller than the smallest element of the aux. array) {
throw it away
} else {
remove the current smallest element of the auxiliary array
place the element into the correct position in the auxiliary array
}
}
then return the smallest (the Kth) element of the auxiliary array
我提出了以下解决方案:
public int findElement() throws IndexingError {
int[] bigArray = getArray();
int k = getIndex();
if (k <= 0 || k > bigArray.length) {
throw new IndexingError();
}
int[] smallArray = Arrays.copyOfRange(bigArray,0,k-1);
Arrays.sort(smallArray);
for (int i = k; i < bigArray.length; i++) {
for (int ii = 1; ii < smallArray.length; ii++) {
smallArray[ii-1] = smallArray[ii];
if (bigArray[i] > smallArray[ii]) {
smallArray[ii] = bigArray[i];
System.out.println(smallArray[ii] + " " + smallArray[ii-1] + " " + bigArray[i]);
break;
}
}
}
return smallArray[0];
}
例如:
代码应根据以下信息返回值:8。
array = [2, 3, 8, 7, 1, 6, 5, 9, 4, 0]
k = 2
运行上面的代码每次都会产生不同的输出,如果运行足够的次数,您将得到正确的答案?
有人可以识别/修复我的代码中的缺陷吗?
答案 0 :(得分:0)
您需要解决以下问题:
Arrays.copyOfRange(array, from, to)
方法中,to
索引是排他的。因此,您需要像Arrays.copyOfRange(bigArray,0,k)
这样,才能将第一个k
元素复制到辅助数组中。例如,让辅助数组为[4, 6]
,下一个主数组元素为2
。根据您的逻辑,辅助数组将更新为[6, 6]
,因为您首先将索引1
处的元素复制到辅助数组中的索引0
,然后检查新元素(来自main数组)大于辅助数组中索引1
处的元素。在这种情况下,新元素较小,因此仅发生复制,并且我们的辅助数组已损坏。
您只需要做的是,对于主数组中的每个新元素,检查它是否大于辅助数组中的第一个元素。如果是,则此新元素应该是辅助数组的一部分,并应放置在正确的位置。您可以使用气泡排序技术找到合适的位置。
public int findElement() throws IndexingError {
int[] bigArray = getArray();
int k = getIndex();
if (k <= 0 || k > bigArray.length) {
throw new IndexingError();
}
int[] smallArray = Arrays.copyOfRange(bigArray,0,k);
Arrays.sort(smallArray);
for (int i = k; i < bigArray.length; i++) {
if(bigArray[i] > smallArray[0]) {
smallArray[0] = bigArray[i];
int j = 0;
while((j < k-1) && (smallArray[j] > smallArray[j+1])) {
swap(smallArray[j], smallArray[j+1]);
j++;
}
}
}
return smallArray[0];
}