讨论/题目交流/🐱 第 14 场夜喵双周赛/
🐱 第 14 场夜喵双周赛

欢迎在这里交流分享你的参赛心得以及体验。【前往竞赛

image.png

3 分 - 十六进制魔术数字
5 分 - 删除区间
5 分 - 删除树节点
7 分 - 矩形内船只的数目

自我感觉,第二题和第四题的代码比较简洁,贴一下
第 2 题,直接判断 当前区间和要删除区间的关系,

    vector<vector<int>> removeInterval(vector<vector<int>>& intervals, vector<int>& del) {
        vector<vector<int>> res;
        for (auto &it : intervals) {
            // 当前区间和待删除区间  没有任何交集
            if (it[1] <= del[0] || del[1] <= it[0]) res.push_back(it);
            // 当前区间在待删除区间的左侧发生了一点交集
            if (del[0] <= it[1] && del[0] > it[0]) res.push_back({it[0], del[0]});
            //  当前区间在待删除区间的右侧发生了一点交集
            if (del[1] <= it[1] && del[1] > it[0]) res.push_back({del[1], it[1]});
        }
        return res;
    }

第四题 把区间分成四个区域,然后递归即可,

    int countShips(Sea sea, vector<int> up, vector<int> down) {
        // 当前区域不合理
        if (down[0] > up[0] || down[1] > up[1]) return 0;
        // 当前区域没有船
        if (!sea.hasShips(up, down)) return 0;
        // 当前区域只有一个点,并且有船
        if (up[0] == down[0] && up[1] == down[1]) return 1;

        // 计算坐标
        int lowx = down[0], highx = up[0], lowy = down[1], highy = up[1];
        int midx = (lowx + highx) / 2, midy = (lowy + highy) / 2;
        // 分成 4 个小矩形
        return countShips(sea, {highx, highy}, {midx+1, midy+1}) + countShips(sea, {midx, midy}, {lowx, lowy}) 
                + countShips(sea, {midx, highy}, {lowx, midy+1}) + countShips(sea, {highx, midy}, {midx+1, lowy});
    }
4
展开全部 8 讨论