如何解决我对最小差异算法问题的解决方案是否具有最佳时空复杂度OnLogn+ mLogm?
这是我的解决方案:
function smallestDifference(arrayOne,arrayTwo) {
const combinedArray = [...arrayOne,...arrayTwo];
combinedArray.sort((a,b) => a - b);
let smallestDifference = Infinity;
let arrayOneInt = null;
let arrayTwoInt = null;
for (let i = 0; i < combinedArray.length - 1; i++) {
if (Math.abs(combinedArray[i] - combinedArray[i+1]) < smallestDifference) {
if (arrayOne.includes(combinedArray[i]) && arrayTwo.includes(combinedArray[i+1])) {
smallestDifference = Math.abs(combinedArray[i] - combinedArray[i+1]);
arrayOneInt = combinedArray[i];
arrayTwoInt = combinedArray[i+1];
} else if (arrayOne.includes(combinedArray[i+1]) && arrayTwo.includes(combinedArray[i])) {
smallestDifference = Math.abs(combinedArray[i] - combinedArray[i+1]);
arrayOneInt = combinedArray[i+1];
arrayTwoInt = combinedArray[i];
}
}
}
return [arrayOneInt,arrayTwoInt];
}
这是给定的最佳解决方案
function smallestDifference(arrayOne,arrayTwo) {
arrayOne.sort((a,b) => a - b);
arrayTwo.sort((a,b) => a - b);
let idxOne = 0;
let idxTwo = 0;
let smallest = Infinity;
let current = Infinity;
let smallestPair = [];
while (idxOne < arrayOne.length && idxTwo < arrayTwo.length) {
let firstNum = arrayOne[idxOne];
let secondNum = arrayTwo[idxTwo];
if (firstNum < secondNum) {
current = secondNum - firstNum;
idxOne++;
} else if (secondNum < firstNum) {
current = firstNum - secondNum;
idxTwo++;
} else {
return [firstNum,secondNum]
}
if (smallest > current) {
smallest = current;
smallestPair = [firstNum,secondNum];
}
}
return smallestPair;
}
对于上述给定的最佳解决方案,它表示时间复杂度为O(nLog(n)+ mLog(m)),空间复杂度为O(1)。我上面的解决方案是否也与此时间复杂度相符?
解决方法
您遍历了长度为N + M的combinedArray
循环。在此循环中,您有arrayOne.includes
和arrayTwo.includes
,它们的时间复杂度为O(N)和O(M)。>
因此您至少有 O((N + M)^ 2),它大于 O(n Log(m)+ m Log( n))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。