在 JavaScript 中查找数组中的特殊对
问题
我们需要编写一个 JavaScript 函数,该函数以整数数组 arr 作为第一个且唯一的参数。
我们的函数应统计满足以下条件的所有此类索引对 (i, j):
I < j,且
arr[i] > 2 * arr[j]
例如,如果函数的输入是 -
const input = [2, 4, 3, 5, 1];
那么输出应为 -
const output = 3;
输出说明
因为三个所需对为 -
[4, 1], [3, 1] and [5, 1]
示例
以下为此代码 -
const arr = [2, 4, 3, 5, 1];
const peculiarPairs = (arr = []) => {
let count = 0;
let copy = arr.slice().sort((a,b)=> a - b);
let bit = new Array(arr.length+1).fill(0);
for (const num of arr){
count += search(bit, indexed(copy, 2*num+1));
bit = insert(bit, indexed(copy, num));
};
return count;
};
const search = (bit, i) => {
let sum = 0;
while (i < bit.length){
sum += bit[i];
i += i & -i;
}
return sum;
}
const insert = (bit, i) => {
while (i > 0){
bit[i] += 1;
i -= i & -i;
}
return bit;
}
const indexed = (arr, val) => {
let l = 0, r = arr.length-1, m = 0;
while (l <= r) {
m = l + ((r-l) >> 1);
if (arr[m] >= val){
r = m-1;
}else{
l = m+1;
}
}
return l+1;
}
console.log(peculiarPairs(arr));代码说明
我们在其中使用了二进制索引树 (BIT) -
二进制索引树或 BIT 表示为一个数组。二进制索引树的每个节点存储输入数组中某些元素的和。二进制索引树的大小等于输入数组的大小。
输出
控制台中的输出将为 -
3
广告
数据结构
网络
RDBMS
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP