Leetcode 391 Solution

This article provides solution to leetcode question 391 (perfect-rectangle)

https://leetcode.com/problems/perfect-rectangle

Solution

class Solution {
    unordered_map<uint64_t, int> m;

public:
    bool isvalid(int x, int y, int flag)
    {
        auto pt = ((uint64_t)x << 32) + (uint64_t)y;
        auto& val = m[pt];
        if (val & flag)
            return false;

        val |= flag;
        return true;
    }

    bool isRectangleCover(vector<vector<int>>& rectangles) {
        int min_x = INT_MAX;
        int min_y = INT_MAX;
        int max_x = INT_MIN;
        int max_y = INT_MIN;
        int64_t area = 0;

        for (auto rect : rectangles)
        {
            min_x = min(min_x, rect[0]);
            min_y = min(min_y, rect[1]);
            max_x = max(max_x, rect[2]);
            max_y = max(max_y, rect[3]);

            if (isvalid(rect[0], rect[1], 1) == false)
                return false;

            if (isvalid(rect[0], rect[3], 2) == false)
                return false;

            if (isvalid(rect[2], rect[3], 4) == false)
                return false;

            if (isvalid(rect[2], rect[1], 8) == false)
                return false;

            area += (rect[2] - rect[0]) * (rect[3] - rect[1]);
        }

        int cnt = 0;

        for (auto pair : m)
        {
            int val = pair.second;

            if (val == 1 || val == 2 || val == 4 || val == 8)
                cnt++;
            else if (val != 15 && val != 12 && val != 10 && val != 9 && val != 6 && val != 5 && val != 3)
                return false;
        }

        return cnt == 4 && area == (max_x - min_x) * (max_y - min_y);
    }
};