ปัญหา
เราจำเป็นต้องเขียนฟังก์ชัน JavaScript ที่รับอาร์เรย์ของจำนวนเต็มที่ไม่ติดลบ arr เป็นอาร์กิวเมนต์แรก และจำนวนเต็ม, num, (num
งานของฟังก์ชันของเราคือแบ่งอาร์เรย์ออกเป็น num non-empty subarrays ต่อเนื่องกัน ควรแยกอาร์เรย์ในลักษณะที่จะลดผลรวมที่ใหญ่ที่สุดในบรรดาอาร์เรย์ย่อย num เหล่านี้ ฟังก์ชันของเราควรส่งคืนผลรวมที่ใหญ่ที่สุดที่สะสมในอาร์เรย์ย่อย
ตัวอย่างเช่น หากอินพุตของฟังก์ชันคือ −
จากนั้นผลลัพธ์ควรเป็น −
แม้ว่าจะมีสี่วิธีในการแบ่งอาร์เรย์ดั้งเดิมเป็นอาร์เรย์ย่อย แต่ถ้าเราแบ่งอาร์เรย์ออกเป็นสองกลุ่ม [5, 1, 4] และ [8, 7] แล้ว ทั้งสองกลุ่มจะมีผลรวมน้อยที่สุดและกลุ่มที่ใหญ่กว่าของทั้งสองกลุ่มคือ 8 + 7 =15 ซึ่งฟังก์ชันของเราควรส่งคืน
รหัสสำหรับสิ่งนี้จะเป็น −
เราใช้ Binary Search เพื่อตรวจสอบว่าเราสามารถหาการแบ่งที่ดีที่สุดได้หรือไม่
ผลลัพธ์ในคอนโซลจะเป็น -const arr = [5, 1, 4, 8, 7];
const num = 2;
const output = 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));
คำอธิบายโค้ด:
ผลลัพธ์
15