ได้รับมือไพ่เป็นอาร์เรย์จำนวนเต็ม ต้องการจัดเป็นกลุ่มขนาด W ให้แต่ละกลุ่มเป็นตัวเลขติดต่อกัน W ตัว ตรวจสอบว่าทำได้หรือไม่
ตัวอย่าง
Input − hand = [1,2,3,6,2,3,4,7,8], W = 3 Output − true
คำอธิบาย − จัดได้: [1,2,3], [2,3,4], [6,7,8]
แนวทางการแก้ปัญหา (Greedy + Map)
- ถ้าจำนวนไพ่ไม่หาร W ลงตัว → false
- ใช้ map นับความถี่แต่ละไพ่ (เรียงลำดับอัตโนมัติ)
- วนจนกว่าไพ่หมด: เริ่มจากไพ่น้อยที่สุดที่ยังมีอยู่
- พยายามสร้างกลุ่ม W ตัวติดต่อกันจากไพ่นั้น
- ถ้าสร้างไม่ได้ทุกกลุ่ม → false
ตัวอย่างโค้ด C++
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
bool isNStraightHand(vector& hand, int W) {
map freq;
for (int x : hand) freq[x]++;
if (hand.size() % W != 0) return false;
while (!freq.empty()) {
int start = freq.begin()->first;
for (int i = 0; i < W; i++) {
int card = start + i;
if (!freq.count(card) || freq[card] == 0) return false;
if (--freq[card] == 0) freq.erase(card);
}
}
return true;
}
};
int main() {
vector hand = {1,2,3,6,2,3,4,7,8};
Solution ob;
cout << (ob.isNStraightHand(hand, 3) ? "true" : "false");
return 0;
}
ผลลัพธ์
true
บทความนี้แก้ปัญหา Hand of Straights (LeetCode 846) โดยใช้ Greedy algorithm กับ Map เรียงลำดับ: เลือกไพ่น้อยที่สุดที่เหลืออยู่และพยายามสร้างกลุ่ม W ตัวติดต่อกันซ้ำๆ จนหมดไพ่