我正在尝试提高功能的效率。它目前是二次方的,我想使它为对数。
当前功能的倒数第三行也使我有些困惑,我想澄清一下。
function solution(arr){
let result = 0
for ( let i = 0; i < arr.length; i++)
for (let j = 0; j < arr.length; j++)
if (arr[i] == arr[j])
result = Math.max(result, Math.abs(i - j));
return result;
}
如何解决此问题?
答案 0 :(得分:2)
至少,您可以更改索引以进行循环,并省略自我检查,并再次检查同一对。
function solution(arr){
let result = 0
for (let i = 0; i < arr.length - 1; i++)
for (let j = i; j < arr.length; j++)
if (arr[i] === arr[j])
result = Math.max(result, Math.abs(i - j));
return result;
}
最短的方法是通过获取用于存储第一个找到的索引值的哈希表的O(n)。
function solution(array) {
var hash = {};
return array.reduce(
(m, v, i) => Math.max(m, i - (hash[v] = v in hash ? hash[v] : i)),
0
);
}
var array = [1, 3, 4, 5, 1, 3, 4, 5, 6, 2, 3];
console.log(solution(array));
答案 1 :(得分:0)
在上面的函数中,目标是从数组中找到最大数目。现在倒数第三行的含义是result = Math.max(result, Math.abs(i - j));
,我将其分为两部分进行解释,
首先,将执行Math.abs(i-j)
并从i
和j
之间的差中提供绝对值。
此后,将调用外部函数Math.max()
方法,该方法将为您提供第一步获得的result
和absolute value
之间的最大值。现在,最大值将存储在result
中。该功能的工作方式就是这样。
现在此语句是基于条件的,这意味着它将仅在arr[i]==arr[j]
时执行。
我希望它可以清除该程序的工作流程。