我需要找到向量中数字之间的最大增加距离或差异。例如,在第一遍的向量[10, 5, 20, 45, 5, 5, 7]
中,它看起来10和45之间的差异是最大的。但在第二次迭代中,5和45之间的差异较大,因此应该由算法选择。
我有一个解决方案,但它是O(n ^ 2),在我的生命中,我无法弄清楚是否有一个计算复杂度较低的解决方案。
public void maxDistance(int inputArray[]) {
int trueMaxValue = 0, trueMinIndex = 0, trueMaxIndex = 0, tempMaxValue;
for (int i = 0; i < inputArray.length - 1; ++i) {
for (int j = i + 1; j < inputArray.length; ++j) {
tempMaxValue = inputArray[j] - inputArray[i];
if (tempMaxValue > trueMaxValue) {
trueMaxValue = tempMaxValue;
trueMinIndex = i;
trueMaxIndex = j;
}
}
}
}
我还需要知道数组中哪两个数字用于最大值。你能帮忙吗?我只是不知道我是否应该继续思考它,或者O(n ^ 2)是你能做的最好的?
答案 0 :(得分:3)
也许我错过了一些东西,但是:
所有这一切都可以在一次迭代中完成。这将找到5和45,并给出40的差异。如上所述 - 只通过一次。
答案 1 :(得分:3)
这可以在线性时间内完成。
这是一个大纲:
迭代数组,跟踪看到的最小数字 到目前为止。
计算到目前为止看到的最小数字与当前数字之间的差异,并跟踪最大的差异。
瞧。
答案 2 :(得分:3)
你可以在O(n)Stephany中完成。您需要添加一些变量来记住当前最佳解决方案。使用当前的命名约定,您可以执行以下操作:
public void maxDistance(int inputArray[]) {
int currentMin = inputArray[0], currentMinIndex = 0;
int trueMaxValue = 0, trueMinIndex = 0, trueMaxIndex = 0;
int tempMaxValue;
int i = 1;
while (i < inputArray.length) {
tempMaxValue = inputArray[i] - inputArray[currentMinIndex];
if (tempMaxValue > trueMaxValue) {
trueMaxValue = tempMaxValue;
trueMinIndex = currentMinIndex;
trueMaxIndex = i;
}
if (inputArray[i] < currentMin) {
currentMinIndex = i;
currentMin = inputArray[i];
}
++i;
}
答案 3 :(得分:1)
你肯定有更好的选择。我不确定为什么在这里需要嵌套循环。我将编辑以包含索引,但我不确定为什么在考虑您的阵列的案例场景中它有用可能会有重复的数字。
int[] inputArray = new int[] {10,5,20,5,5,46,7};
int max = 0;
int min = Integer.MAX_VALUE;
for (int i = 0; i < inputArray.length; i++) {
max = inputArray[i] > max ? inputArray[i] : max;
min = inputArray[i] < min ? inputArray[i] : min;
}
int delta = max - min;
我会修改以包含索引,但我不确定为什么在考虑您的阵列的案例场景中它们会有重复数字。
int[] inputArray = new int[] {10,5,20,5,5,46,7};
int max = 0;
int min = Integer.MAX_VALUE;
int maxIndex = -1;
int minIndex = -1;
for (int i = 0; i < inputArray.length; i++) {
if (inputArray[i] > max) {
max = inputArray[i];
maxIndex = i;
}
if (inputArray[i] < min) {
min = inputArray[i];
minIndex = i;
}
}
int delta = max - min;