ปัญหา
เราจำเป็นต้องเขียนฟังก์ชัน JavaScript ที่รับอาร์เรย์ของจำนวนเต็มที่ไม่ติดลบ arr เป็นอาร์กิวเมนต์แรก และจำนวนเต็ม, num, (num
งานของฟังก์ชันของเราคือแบ่งอาร์เรย์ออกเป็น num non-empty subarrays ต่อเนื่องกัน ควรแยกอาร์เรย์ในลักษณะที่จะลดผลรวมที่ใหญ่ที่สุดในบรรดาอาร์เรย์ย่อย num เหล่านี้ ฟังก์ชันของเราควรส่งคืนผลรวมที่ใหญ่ที่สุดที่สะสมในอาร์เรย์ย่อย
ตัวอย่างเช่น หากอินพุตของฟังก์ชันคือ −
const arr = [5, 1, 4, 8, 7]; const num = 2;
จากนั้นผลลัพธ์ควรเป็น −
const output = 15;
คำอธิบายผลลัพธ์
แม้ว่าจะมีสี่วิธีในการแบ่งอาร์เรย์ดั้งเดิมเป็นอาร์เรย์ย่อย แต่ถ้าเราแบ่งอาร์เรย์ออกเป็นสองกลุ่ม [5, 1, 4] และ [8, 7] แล้ว ทั้งสองกลุ่มจะมีผลรวมน้อยที่สุดและกลุ่มที่ใหญ่กว่าของทั้งสองกลุ่มคือ 8 + 7 =15 ซึ่งฟังก์ชันของเราควรส่งคืน
ตัวอย่าง
รหัสสำหรับสิ่งนี้จะเป็น −
const arr = [5, 1, 4, 8, 7]; const num = 2; const splitArray = (arr = [], num = 1) => { let max = 0; let sum = 0; const split = (arr, mid) => { let part = 1; let tempSum = 0; for (let num of arr) { if (tempSum + num > mid) { tempSum = num; part++; } else { tempSum += num; } } return part; }; for (let num of arr) { max = Math.max(max, num); sum += num; }; let low = max; let high = sum; while (low < high) { let mid = Math.floor((high+low)/2); let part = split(arr, mid); if (part > num) { low = mid + 1; } else { high = mid; } } return low; }; console.log(splitArray(arr, num));
คำอธิบายโค้ด:
เราใช้ Binary Search เพื่อตรวจสอบว่าเราสามารถหาการแบ่งที่ดีที่สุดได้หรือไม่
ผลลัพธ์
ผลลัพธ์ในคอนโซลจะเป็น -
15