สมมติว่าเราได้รับอาร์เรย์ของจำนวนเต็มเรียงลำดับแล้ว ให้เราเรียกมันว่า arr เราจำเป็นต้องหาจำนวนเต็ม x ที่ค่าของ −
abs(a[0] - x) + abs(a[1] - x) + ... + abs(a[a.length - 1] - x)
น้อยที่สุดเท่าที่จะเป็นไปได้ (ในที่นี้หมายถึงค่าสัมบูรณ์) หากมีคำตอบที่เป็นไปได้หลายคำตอบ ให้ส่งออกคำตอบที่น้อยที่สุด
ตัวอย่างเช่น −
สำหรับ
arr = [2, 4, 7],
ผลลัพธ์ควรเป็น −
absoluteValuesSumMinimization(arr) = 4
เพราะ abs(2 - 4) + abs(4 - 4) + abs(7 - 4) =5 ซึ่งเป็นค่าที่น้อยที่สุดที่เราสามารถทำได้ด้วยตัวเลขใดๆ
เรารู้ดีว่า
arr.length/2
คืนค่าความยาวครึ่งหนึ่ง
สำหรับอาร์เรย์ที่มีความยาวเท่ากัน ค่านี้จะอยู่ทางด้านขวาของตรงกลาง สำหรับอาร์เรย์ที่มีความยาวคี่ ให้อยู่ตรงกลาง
-
Math.ceil(arr.length/2) ปัดเศษขึ้นหากจำเป็น ดังนั้นค่ากลางของอาร์เรย์ที่ 5 จะเป็น 2.5 -> 3 ซึ่งจะทำให้อาร์เรย์ที่มีความยาวคี่หลุดออกไปหนึ่งอาร์เรย์
-
Math.ceil(arr.length/2)-1 ลดลงหนึ่งดัชนี วิธีนี้จะช่วยแก้ไขข้อผิดพลาดทีละรายการสำหรับอาร์เรย์ทั้งหมด
ตัวอย่าง
ต่อไปนี้เป็นรหัส -
const arr = [2, 4, 7]; const absoluteValuesSumMinimization = (arr = []) => { const res = []; arr.forEach(num => { const sum = arr.reduce((accum, next) => { return accum + Math.abs(next - num); }, 0); res.push(sum); }); const lowest = Math.min(...res); return arr[res.indexOf(lowest)]; }; console.log(absoluteValuesSumMinimization(arr));
ผลลัพธ์
ต่อไปนี้เป็นผลลัพธ์บนคอนโซล -
4