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

การจัดกลุ่มไพ่เป็นลำดับต่อเนื่อง (Hand of Straights) ใน C++

ได้รับมือไพ่เป็นอาร์เรย์จำนวนเต็ม ต้องการจัดเป็นกลุ่มขนาด 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 ตัวติดต่อกันซ้ำๆ จนหมดไพ่