题目 && 分析

第一题

给你一个 n 行 m 列的矩阵,最开始的时候,每个单元格中的值都是 0。
另有一个索引数组 indices,indices[i] = [ri, ci] 中的 ri 和 ci 分别表示指定的行和列(从 0 开始编号)。
你需要将每对 [ri, ci] 指定的行和列上的所有单元格的值加 1。
请你在执行完所有 indices 指定的增量操作后,返回矩阵中 「奇数值单元格」 的数目。

分析1

可能存在数学的解法,不过当时想了几分钟没啥头绪,就暴力了。
按照题目的意思构建一个 m*n 的矩阵
然后进行矩阵的填充
最后统计奇数的个数

第二题

给你一个 2 行 n 列的二进制数组:

  • 矩阵是一个二进制矩阵,这意味着矩阵中的每个元素不是 0 就是 1。
  • 第 0 行的元素之和为 upper。
  • 第 1 行的元素之和为 lower。
  • 第 i 列(从 0 开始编号)的元素之和为 colsum[i],colsum 是一个长度为 n 的整数数组。

你需要利用 upper,lower 和 colsum 来重构这个矩阵,并以二维整数数组的形式返回它。
如果有多个不同的答案,那么任意一个都可以通过本题。
如果不存在符合要求的答案,就请返回一个空的二维数组。

分析2

S1: 判断是否存在符合要求的答案: - upper 和 lower 的和必须等于 colsum 的和 - colsum 的 size 减去 colsum 中 0 的个数,这个值必须同时大于 upper 和 lower 的任意一个
S2: 初始化 2 行 size 列的矩阵,该矩阵初始化为全零矩阵
S3: - 当 colsum[i]==2 时,结果矩阵的两列必然全为 1 - 当 colsum[i]==1 时,先填充 0 行,同时 upper–,直至 upper 等于 0 时,开始填充第 1 行
S4: 返回结果矩阵

第三题

有一个二维矩阵 grid ,每个位置要么是陆地(记号为 0 )要么是水域(记号为 1 )。
我们从一块陆地出发,每次可以往上下左右 4 个方向相邻区域走,能走到的所有陆地区域,我们将其称为一座「岛屿」。
如果一座岛屿 完全 由水域包围,即陆地边缘上下左右所有相邻区域都是水域,那么我们将其称为 「封闭岛屿」。
请返回封闭岛屿的数目。

传送门

分析3

标准的深搜题,类比 No.200

本题关键的一个隐藏条件:
如果岛屿靠近矩阵边缘,就不算封闭岛屿

两种处理办法: - 在回溯矩阵前,将所有边缘陆地变为海洋 - 在回溯矩阵时,如果遇到边缘,记录下来,不添加到结果中

在实际的操作中,两种解法的思路是一样的,只是处理条件的顺序不一样而已,取舍看个人

第四题

你将会得到一份单词表 words,一个字母表 letters (可能会有重复字母),以及每个字母对应的得分情况表 score。

请你帮忙计算玩家在单词拼写游戏中所能获得的「最高得分」:能够由 letters 里的字母拼写出的 任意 属于 words 单词子集中,分数最高的单词集合的得分。

单词拼写游戏的规则概述如下:

玩家需要用字母表 letters 里的字母来拼写单词表 words 中的单词。
可以只使用字母表 letters 中的部分字母,但是每个字母最多被使用一次。
单词表 words 中每个单词只能计分(使用)一次。
根据字母得分情况表 score,字母 ‘a’, ‘b’, ‘c’, … , ‘z’ 对应的得分分别为 score[0], score[1], …, score[25]。
本场游戏的「得分」是指:玩家所拼写出的单词集合里包含的所有字母的得分之和。

分析4

枚举。
枚举 words 子集总共 2^15 种情况,对于每个子集,统计一下这个子集每个字母用了多少次,是不是 letters 的子集,如果是,计算得分

代码

// Q1:

class Solution {
public:
    int oddCells(int n, int m, vector<vector<int>>& indices) {
        vector<vector<int> > vec = vector(n,vector(m,0));

        for(auto i:indices){
            for(int j = 0;j < m; j++)
                vec[i[0]][j]++;
            for(int j = 0;j < n; ++j)
                vec[j][i[1]]++;
        }

        int count = 0;
        for(auto i:vec)
            for(auto j:i)
                if(j%2 == 1)
                    count++;

        return count;

    }
};


// Q2:

class Solution {
public:
    vector<vector<int>> reconstructMatrix(int upper, int lower, vector<int>& colsum) {
        int sum_res = 0,count2 = 0,count0 = 0;
        for(auto i:colsum){
            sum_res+=i;
            if(i == 2) count2++;
            if(i == 0) count0++;
        }

        if(sum_res!=(upper+lower) || (((colsum.size()-count0)<upper && (colsum.size()-count0)>lower) || ((colsum.size()-count0)>upper && (colsum.size()-count0)<lower)) )
            return {};

        vector<vector<int>> res(2,vector(colsum.size(),0));

        upper -= count2;
        lower -= count2;

        for(int i = 0 ; i< colsum.size() ; ++i){
            if(colsum[i] == 2){
                res[0][i] = 1;
                res[1][i] = 1;
            }else if(colsum[i] == 1){
                if(upper){
                    res[0][i] = 1;
                    upper--;
                }else{
                    res[1][i] = 1;
                }
            }else{
                continue;
            }
        }

        return res;

    }
};



// Q3:

class Solution {
public:
    int d[4][2]={{0,1},{0,-1},{1,0},{-1,0}},m,n;
    vector<vector<bool>> visited;
    bool flag;

    int closedIsland(vector<vector<int>>& grid) {
        m=grid.size();
        if(m==0){
            return 0;
        }
        n=grid[0].size();

        int res = 0;
        visited=vector<vector<bool>>(m,vector<bool>(n,false));

        for(int i=1;i<m-1;i++){
            for (int j=1;j<n-1;j++){
                if(grid[i][j]==0 && !visited[i][j]){
                    flag = false;
                    res++;
                    recursion(grid,i,j);
                    if(flag)
                        res--;
                }
            }
        }

        return res;
    }

    void recursion(vector<vector<int>>& grid,int startx,int starty){

        visited[startx][starty]=true;

        for(int i=0;i<4;i++){
            int newx=startx+d[i][0];
            int newy=starty+d[i][1];
            if(!judge(newx,newy)) flag = true;
            if(judge(newx,newy) && grid[newx][newy]==0 && !visited[newx][newy]){
                recursion(grid,newx,newy);
            }
        }

        return;
    }

    bool judge(int x,int y){
        return x>=0 && y>=0 && x<m && y<n;
    }
};


//Q4:

class Solution {
public:
    int maxScoreWords(vector<string>& words, vector<char>& letters, vector<int>& score) {
        vector<int> stat(26, 0);
        for (char& c: letters) {
            stat[c - 'a']++;
        }

        int ret = 0;
        for (int i = 1;i < (1 << words.size());i++) {
            vector<int> g = group(words, i);
            int temp = 0;
            for (int j = 0;j < 26;j++) {
                if (g[j] > stat[j]) {
                    temp = -1;
                    break;
                } else {
                    temp += g[j] * score[j];
                }
            }
            if (temp != -1) {
                ret = max(ret, temp);
            }
        }
        return ret;
    }


    vector<int> group(vector<string>& words, int bit) {
        vector<int> ret(26, 0);
        for (int i = 0;i < words.size();i++) {
            if (bit & (1 << i)) {
                for (int j = 0;j < words[i].size();j++) {
                    ret[words[i][j] - 'a']++;
                }
            }
        }
        return ret;
    }
};

后记

也许吧(⊙o⊙)…