Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> JavaScript

การเพิ่มสมาชิกให้อาร์เรย์เพื่อให้สร้างผลรวมได้ทุกค่าในช่วง [0, num] ใน JavaScript

ปัญหา

กำหนดอาร์เรย์ arr และ target sum หาจำนวนน้อยที่สุดของตัวเลขที่ต้องเพิ่มเข้าไป เพื่อให้สามารถสร้างผลรวมได้ทุกค่าใน [0, target]

ตัวอย่าง

arr = [1, 5, 10], target = 20
เพิ่ม 2 และ 4 -> สร้างได้ทุกค่า 0-20 -> output: 2

ตัวอย่างโค้ด

const arr = [1, 5, 10];
const sum = 20;

const minimumAddition = (arr = [], sum = 1) => {
  let canAdd = 1;
  let count = 0, i = 0;
  while (canAdd <= sum) {
    if ((i >= arr.length) || (canAdd < arr[i])) {
      count++;
      canAdd += canAdd;
    } else {
      canAdd += arr[i++];
    }
  }
  return count;
};

console.log(minimumAddition(arr, sum));

ผลลัพธ์

2

คำอธิบาย

Greedy: canAdd = ค่าสูงสุดที่สร้างได้ติดต่อกันจาก 0 จนถึงปัจจุบัน

หาก arr[i] <= canAdd: เพิ่ม arr[i] เข้าไป -> สร้างได้ถึง canAdd + arr[i]

หาก arr[i] > canAdd (หรือ arr หมด): ต้องเพิ่ม canAdd เอง (patch) -> canAdd *= 2

Time: O(n log target), Space: O(1)

เป็นปัญหา "Patching Array" (LeetCode 330)