2 回答

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超13個贊
有一個解決方案具有O(1)額外的空間復(fù)雜性和O(n)時間復(fù)雜性。
由于數(shù)組已排序,因此有兩個索引是有意義的:一個從數(shù)組的開頭到結(jié)尾(比如y),另一個從數(shù)組的結(jié)尾到開頭(比如x)。
這是代碼:
function averagePair(arr,tar){
// That's now included in for-loop condition
// if (arr.length < 2) {
// return false;
// }
let x = arr.length - 1;
for (var y = 0; y < x; y++) {
// Division may lose precision, so it's better to compare
// arr[x] + arr[y] > 2*tar
// than
// (arr[x] + arr[y]) / 2 > tar
while (y < x && arr[x] + arr[y] > 2*tar) {
x--;
}
if (x != y && arr[x] + arr[y] == 2*tar) {
return true;
}
}
return false;
}
這是一種雙指針技術(shù):我們將減少x直到a[x] + a[y] > 2*tar當(dāng)前循環(huán)迭代,因?yàn)槲覀冃枰业阶罱咏钠ヅ漤?xiàng)。在下一個 for 循環(huán)迭代a[y]大于或等于前一個,因此檢查是否a[z] + a[y] == 2*tar為 any是沒有意義的z > x。我們將這樣做直到索引不相等,這意味著沒有匹配。

TA貢獻(xiàn)1844條經(jīng)驗(yàn) 獲得超8個贊
您只比較相鄰的元素,例如[0]vs[1]和[1]vs [2]。您還需要比較[0]vs[2]等等。最簡單的調(diào)整是使用嵌套循環(huán):
for (let x = 0; x < arr.length; x++) {
for (let y = 0; y < arr.length; y++) {
if (x !== y) {
// test arr[x] against arr[y]
但是使用 Set 來跟蹤到目前為止發(fā)現(xiàn)的內(nèi)容會更優(yōu)雅且計(jì)算復(fù)雜性更低(O(n)而不是):O(n ^ 2)
const nums = new Set();
for (const num of arr) {
if (nums.has(tar - num)) {
return true;
} else {
nums.add(num);
}
}
function averagePair(arr,tar){
const nums = new Set();
for (const num of arr) {
if (nums.has(tar - num)) {
return true;
} else {
nums.add(num);
}
}
return false;
}
console.log(averagePair([-2, 3, 2], 0));
console.log(averagePair([-2, 3, 3], 0));
添加回答
舉報