Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Javascript

ค้นหาคู่ที่แปลกประหลาดในอาร์เรย์ใน JavaScript


ปัญหา

เราจำเป็นต้องเขียนฟังก์ชัน JavaScript ที่รับอาร์เรย์ของจำนวนเต็ม, arr เป็นอาร์กิวเมนต์แรกและอาร์กิวเมนต์เดียว

ฟังก์ชันของเราควรนับการเกิดของคู่ดัชนีดังกล่าวทั้งหมด (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));

คำอธิบายโค้ด

เราได้ใช้ Binary Indexed Tree (BIT) -

Binary Indexed Tree หรือ BIT จะแสดงเป็นอาร์เรย์ ให้อาร์เรย์เป็น BITree[] แต่ละโหนดของ Binary Indexed Tree จะเก็บผลรวมขององค์ประกอบบางอย่างของอาร์เรย์อินพุต ขนาดของ Binary Indexed Tree เท่ากับขนาดของอินพุตอาร์เรย์

ผลลัพธ์

และผลลัพธ์ในคอนโซลจะเป็น −

3