讨论/题目交流/ 🏆 第 165 场力扣周赛/
🏆 第 165 场力扣周赛

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

image.png

4 分 - 找出井字棋的获胜者
4 分 - 不浪费原料的汉堡制作方案
5 分 - 统计全为 1 的正方形子矩阵
6 分 - 分割回文串 III

展开讨论
力扣 (LeetCode)发起于 2019-12-01
最近编辑于 2019-12-01

只能完成两道题,觉得自己还是比较菜的...

第一道题 5275. 找出井字棋的获胜者
模拟下棋步骤就做出来了

class Solution {
public:
    string tictactoe(vector<vector<int>>& moves) {
        //棋盘
        int pan[3][3] = {{0,0,0},{0,0,0},{0,0,0}};
        //下棋
        for(int i = 0; i < moves.size(); i++){
            pan[moves[i][0]][moves[i][1]] = (i % 2 == 0?1:-1);
        }
        //下满了吗
        bool isFulled = moves.size() == 9?true:false;
        //横纵统计,前三位A,后三位B
        int x[6] = {0,0,0,0,0,0};
        int y[6] = {0,0,0,0,0,0};
        //两条对角线统计,前A后B
        int cl[2] = {0,0};
        int cr[2] = {0,0};
        //开始统计
        for(int i = 0; i < 3; i++){
            for(int j = 0; j < 3; j++){
                if(pan[i][j] == 1){
                    x[i]++;
                    y[j]++;
                    //左对角线
                    if(i + j == 0 || i + j == 4){
                        cl[0]++;
                    }//右对角线
                    else if(i + j == 2){
                        //中间补充
                        if(i == j)  cl[0]++;
                        cr[0]++;
                    }
                }else if(pan[i][j] == -1){
                    x[i+3]++;
                    y[j+3]++;
                    //左对角线
                    if(i + j == 0 || i + j == 4){
                        cl[1]++;
                    }//右对角线
                    else if(i + j == 2){
                        //中间补充
                        if(i == j)  cl[1]++;
                        cr[1]++;
                    }
                }
            }
        }
        //直线判断
        for(int i = 0; i < 6; i++){
            if(x[i] == 3 || y[i] == 3){
                return i < 3?"A":"B";
            }
        }
        //对角线判断
        if(cl[0] == 3 || cr[0] == 3){
            return "A";
        }else if(cl[1] == 3 || cr[1] == 3){
            return "B";
        }
        //终局判断
        if(isFulled)    return "Draw";
        return "Pending";
    }
};

第二道题 5276. 不浪费原料的汉堡制作方案
看完题目以后瞬间就脑补到鸡兔同笼(二元一次方程组),把番茄看做腿,芝士看成头...
然后只需要针对一些特殊情况处理一下就通过了

class Solution {
public:
    vector<int> numOfBurgers(int tomatoSlices, int cheeseSlices) {
        if(cheeseSlices == tomatoSlices && tomatoSlices == 0)   return {0,0};
        if(tomatoSlices % 2 != 0 || cheeseSlices == 0)   return {};
        int x = (tomatoSlices - 2 * cheeseSlices) / 2;
        int y = cheeseSlices - x;
        if(x < 0 || y < 0) return {};
        return {x,y};
    }
};

第三道题 5277. 统计全为 1 的正方形子矩阵
做的时候脑子里是卷积运算的想法,但能力不足...用C++写的时候各种出问题,时间来不及了...
以下是我做的思路:
第一层和第二层循环分别作为卷积核的偏移,
第三层和第四层循环就对每个核内的数字进行累加,
总数等于边长²的就累加一个正方形。

展开全部 11 讨论