LeetCode_Dec_1st_Week

Posted KuoGavin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode_Dec_1st_Week相关的知识,希望对你有一定的参考价值。

December 6th : 1816. 截断句子
December 7th : 1034. 边界着色


December 6th : 1816. 截断句子

今天我就24周岁啦!承蒙厚爱~ ,得到了人生中的第一个乐高模型,许愿今后能开起不差的B级车吧~💪💪💪!感谢亲爱的!刷个题助助兴 ~

读过题,单词间是固定单个空格的,那么就记录还剩余多少单词没有加上,同时维护窗口,窗口的左右字符都是空格,则说明是一个单词。这样遍历整个输入字符串,然后截取出前k个单词,并拼接成字符串返回即可。

class Solution 
public:
    string truncateSentence(string s, int k) 
        string ret;
        for(int i = 0; i < s.size(); ++i) 
            if(s[i] == ' ') continue;
            if(k == 0) break; //单词截取完了
            int l = i, r = i; //窗口左右边界
            while(r < s.size() && s[r] != ' ') r++; //没遇到空格,则扩大窗口
            for(int j = i; j < r; ++j) ret += s[j]; //把窗口中单词加到结果字符串上
            k--; i = r;  //更新剩余单词数,同时更新i的值,以作为新的窗口的初始化值
            if(k != 0) ret += " "; //如果不是末尾单词,要加上空格作为分隔符
        
        return ret;
    
;

December 7th : 1034. 边界着色

将连通集的边界(网格边界,和不同颜色的边界)染成指定的颜色。就相当于小岛的题,使用dfs或者bfs均可。这里使用dfs,其中如何求得边界是关键,当dfs到网格边界或者发现相邻格子和初始格子的颜色不一致时,则可判定当前所遍历到的格子是边界格子。再将边界的格子着上指定的颜色即可。

class Solution 
public:
    vector<vector<int>> colorBorder(vector<vector<int>>& grid, int row, int col, int color) 
        if(row < 0 || row >= grid.size() || col < 0 || col >= grid[0].size()) return grid;
        visited = vector<vector<int>>(grid.size(), vector<int>(grid[0].size(), 0)); //初始化访问记录
        dfs(grid, visited, row, col, color); //进行dfs
        for(int i = 0; i < grid.size(); ++i) //进行边界着色
            for(int j = 0; j < grid[0].size(); ++j)
                if(visited[i][j] == 2) grid[i][j] = color;
        return grid;
    

private:
    vector<int> direction = -1, 0, 1, 0, -1; //方向向量
    vector<vector<int>> visited; //记录是否访问过,进行dfs剪枝,同时能记录边界
    void dfs(vector<vector<int>>& grid, vector<vector<int>>& visited, int row, int col, int color) 
        if(row < 0 || row >= grid.size() || 
           col < 0 || col >= grid[0].size() || visited[row][col]) return; //如果坐标不合法返回
        visited[row][col] = 1; //标记已经遍历过该坐标
        for(int i = 0; i < 4; i++)  //遍历当前坐标上下左右的四个坐标
            int row_new = row + direction[i], col_new = col + direction[i+1];
            if(row_new >= 0 && row_new < grid.size() && 
                col_new >= 0 && col_new < grid[0].size() &&
                grid[row][col] == grid[row_new][col_new]) //如果符合,则说明没有到达连通集边界
                dfs(grid, visited, row_new, col_new, color);
            else visited[row][col] = 2; //如果不符合,则说明到达连通集边界,将当前坐标标记为2
        
    
;

以上是关于LeetCode_Dec_1st_Week的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode_Nov_1st_Week

LeetCode_Dec_2nd_Week

LeetCode_Dec_2nd_Week

LeetCode_Dec_3rd_Week

LeetCode_Dec_3rd_Week

LeetCode_Dec_3rd_Week