กลับไปยังโจทย์
ปานกลาง 0 ข้อที่แก้แล้ว อัตราผ่าน 0%

ผลรวมเหรียญที่ขาดหายที่น้อยที่สุด

หาจำนวนเงินบวกที่น้อยที่สุดที่ไม่สามารถสร้างได้จากเหรียญที่มีอยู่

สิ่งที่คุณจะได้เรียนรู้

  • เรียงเหรียญแล้วติดตามผลรวมที่ทำได้
  • หาจำนวนเงินแรกที่จ่ายไม่ได้
  • พิสูจน์ว่าทำไมกฎแบบละโมบจึงใช้ได้

โจทย์

คุณสามารถเลือกเหรียญจากชุดที่ให้มาได้ตามต้องการ โดยแต่ละเหรียญสามารถใช้ได้เพียงครั้งเดียว แม้จะมีเหรียญหลายเหรียญที่มีมูลค่าเท่ากันก็ตาม จงหาจำนวนเต็มบวกที่น้อยที่สุดซึ่งไม่สามารถสร้างได้จากการเลือกเหรียญใด ๆ

ให้เขียนฟังก์ชัน missing_coin_sum(coins)

อินพุต

coins: มูลค่าของเหรียญที่มีอยู่ แต่ละค่าซ้ำกันได้ หมายถึงเหรียญคนละเหรียญ

เอาต์พุต

ให้คืนค่าจำนวนเต็มบวกที่น้อยที่สุดซึ่งไม่สามารถสร้างได้

เงื่อนไข

1 ≤ จำนวนเหรียญ ≤ 200,000 แต่ละค่ามีค่าระหว่าง 1 ถึง 1,000,000,000

ตัวอย่าง

ตัวอย่างที่ 1
อินพุต:
coins = [1, 1, 4]

ผลลัพธ์ที่คาดหวัง:
expected = 3
อินพุต:
std::vector<long long> coins = {1, 1, 4};

ผลลัพธ์ที่คาดหวัง:
long long expected = 3;
อินพุต:
long[] coins = new long[] {1, 1, 4};

ผลลัพธ์ที่คาดหวัง:
long expected = 3;

คำอธิบาย

จำนวนเงิน 1 และ 2 สามารถสร้างได้โดยใช้เหรียญมูลค่า 1 แต่ไม่มีชุดเหรียญใดรวมกันได้ 3

ตัวอย่างที่ 2
อินพุต:
coins = [2, 3]

ผลลัพธ์ที่คาดหวัง:
expected = 1
อินพุต:
std::vector<long long> coins = {2, 3};

ผลลัพธ์ที่คาดหวัง:
long long expected = 1;
อินพุต:
long[] coins = new long[] {2, 3};

ผลลัพธ์ที่คาดหวัง:
long expected = 1;

คำอธิบาย

ไม่สามารถสร้างจำนวนเงิน 1 ได้เลย เพราะทุกเหรียญมีมูลค่าอย่างน้อย 2

แนวทางการแก้

ลองทำเองก่อน แล้วค่อยเปิดคำใบ้ทีละข้อ

คำใบ้ 1

เรียงเหรียญก่อน แล้วค่อยสร้างผลรวมต่ำสุดที่ทำได้จากน้อยไปมาก

คำใบ้ 2

ถ้าเหรียญตัวถัดไปมากกว่าค่าที่ยังสร้างไม่ได้ตัวแรก ค่านั้นจะไม่มีวันถูกสร้างได้

คำใบ้ 3

เหรียญซ้ำช่วยได้ก็ต่อเมื่อมันขยายช่วงที่สร้างได้อยู่โดยไม่เกิดช่องว่าง

ความซับซ้อนที่คาดหวัง

O(n log n) time, O(1) extra space, excluding sorting implementation details

แหล่งอ้างอิง

โจทย์นี้ปรับให้เหมาะกับ CodeUtility กรุณาทำตามคำชี้แจงและข้อจำกัดด้านบน

เรียนรู้จากคนอื่น

แนวทางจากชุมชน

ยังไม่มีวิธีทำที่เผยแพร่ ลองแก้โจทย์นี้เพื่อแชร์วิธีแรก