โจทย์
คุณสามารถเลือกเหรียญจากชุดที่ให้มาได้ตามต้องการ โดยแต่ละเหรียญสามารถใช้ได้เพียงครั้งเดียว แม้จะมีเหรียญหลายเหรียญที่มีมูลค่าเท่ากันก็ตาม จงหาจำนวนเต็มบวกที่น้อยที่สุดซึ่งไม่สามารถสร้างได้จากการเลือกเหรียญใด ๆ
ให้เขียนฟังก์ชัน missing_coin_sum(coins)
อินพุต
coins: มูลค่าของเหรียญที่มีอยู่ แต่ละค่าซ้ำกันได้ หมายถึงเหรียญคนละเหรียญ
เอาต์พุต
ให้คืนค่าจำนวนเต็มบวกที่น้อยที่สุดซึ่งไม่สามารถสร้างได้
เงื่อนไข
1 ≤ จำนวนเหรียญ ≤ 200,000 แต่ละค่ามีค่าระหว่าง 1 ถึง 1,000,000,000
ตัวอย่าง
อินพุต:
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
อินพุต:
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 กรุณาทำตามคำชี้แจงและข้อจำกัดด้านบน