【LeetCode】FloodFill精选6题

目录

1. 图像渲染(简单)

1.1 BFS

1.2 DFS

2. 岛屿数量(中等)

2.1 BFS

2.2 DFS

3. 岛屿的最大面积(中等)

3.1 BFS

3.2 DFS

4. 被围绕的区域(中等)

4.1 BFS

4.2 DFS

5. 飞地的数量(中等)

5.1 BFS

5.2 DFS

6. 太平洋大西洋水流问题(中等)

6.1 BFS

6.2 DFS


FloodFill算法:从一个起始位置开始,找性质相同的连通块。

1. 图像渲染(简单)

题目描述有问题,所谓“像素值”就是指该像素点的颜色。

先让初始坐标上色,再让其上下左右的坐标上色。

1.1 BFS

先让初始坐标(sr, sc)入队并上色,队列中:(sr, sc)

让(sr, sc)出队,让(sr, sc)的上下左右入队并上色(假设都满足条件),队列中:(sr, sc)(sr-1, sc)(sr+1, sc)(sr, sc-1)(sr, sc+1)

让(sr-1, sc)(sr+1, sc)(sr, sc-1)(sr, sc+1)出队,让它们各自的上下左右入队并上色(假设都满足条件),队列中:是刚才出队的坐标的上下左右

……

直到队列为空,BFS结束。

注意入队的坐标要满足条件:不能越界且颜色和初始坐标的颜色相同。

class Solution {
public:
    vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int color) {
        clr = image[sr][sc];
        if (clr == color) // 不修改颜色
            return image;

        m = image.size();
        n = image[0].size();

        bfs(image, sr, sc, color);
        return image;
    }

private:
    void bfs(vector<vector<int>>& image, int r, int c, int color)
    {
        queue<pair<int, int>> q;
        // 初始坐标入队并上色
        q.push({r, c});
        image[r][c] = color;
        while (!q.empty())
        {
            // 队头出队
            auto [row, col] = q.front();
            q.pop();
            // 判断刚才出队的坐标上下左右是否满足条件,满足条件则入队并上色
            for (int i = 0; i < 4; i++)
            {
                int x = row + dr[i];
                int y = col + dc[i];
                if (x >= 0 && x < m && y >= 0 && y < n && image[x][y] == clr)
                {
                    q.push({x, y});
                    image[x][y] = color;
                }
            }
        }
    }

    // 坐标上下左右的偏移量
    int dr[4] = { -1,1,0,0 };
    int dc[4] = { 0,0,-1,1 };

    int m;
    int n;
    int clr; // 初始的颜色
};

1.2 DFS

class Solution {
public:
    vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int color) {
        clr = image[sr][sc];
        if (clr == color) // 不修改颜色
            return image;

        m = image.size();
        n = image[0].size();

        dfs(image, sr, sc, color);
        return image;
    }

private:
    void dfs(vector<vector<int>>& image, int r, int c, int color)
    {
        // 初始坐标上色
        image[r][c] = color;
        // 判断初始坐标上下左右是否满足条件,满足条件则递归上色
        for (int i = 0; i < 4; i++)
        {
            int x = r + dr[i];
            int y = c + dc[i];
            if (x >= 0 && x < m && y >= 0 && y < n && image[x][y] == clr)
            {
                dfs(image, x, y, color);
            }
        }
    }

    // 坐标上下左右的偏移量
    int dr[4] = { -1,1,0,0 };
    int dc[4] = { 0,0,-1,1 };

    int m;
    int n;
    int clr; // 初始的颜色
};

2. 岛屿数量(中等)

创建一个和原二维数组大小相等的二维数组visited,用来标记坐标是否被访问过。

遍历二维数组,遇到没访问过的'1',则以它为起始坐标向周围扩散,这就是一个岛屿,并且岛屿要被标记。

2.1 BFS

class Solution {
public:
    int numIslands(vector<vector<char>>& grid) {
        m = grid.size();
        n = grid[0].size();
        visited.resize(m, vector<bool>(n));
        int ans = 0;

        for (int i = 0; i < m; i++)
        {
            for (int j = 0; j < n; j++)
            {
                if (grid[i][j] == '1' && !visited[i][j])
                {
                    ans++;
                    bfs(grid, i, j); // 把这块岛屿全部标记一下
                }
            }
        }
        return ans;
    }

private:
    void bfs(vector<vector<char>>& grid, int r, int c)
    {
        queue<pair<int, int>> q;
        // 初始坐标入队并标记
        q.push({r, c});
        visited[r][c] = true;
        while (!q.empty())
        {
            // 队头出队
            auto [row, col] = q.front();
            q.pop();
            // 判断刚才出队的坐标上下左右是否满足条件,满足条件则入队并标记
            for (int i = 0; i < 4; i++)
            {
                int x = row + dr[i];
                int y = col + dc[i];
                if (x >= 0 && x < m && y >= 0 && y < n && grid[x][y] == '1' && !visited[x][y])
                {
                    q.push({x, y});
                    visited[x][y] = true;
                }
            }
        }
    }

    // 坐标上下左右的偏移量
    int dr[4] = { -1,1,0,0 };
    int dc[4] = { 0,0,-1,1 };

    int m;
    int n;
    vector<vector<bool>> visited; // 标记坐标是否被访问过
};

2.2 DFS

class Solution {
public:
    int numIslands(vector<vector<char>>& grid) {
        m = grid.size();
        n = grid[0].size();
        visited.resize(m, vector<bool>(n));
        int ans = 0;

        for (int i = 0; i < m; i++)
        {
            for (int j = 0; j < n; j++)
            {
                if (grid[i][j] == '1' && !visited[i][j])
                {
                    ans++;
                    dfs(grid, i, j); // 把这块岛屿全部标记一下
                }
            }
        }
        return ans;
    }

private:
    void dfs(vector<vector<char>>& grid, int r, int c)
    {
        // 初始坐标标记访问
        visited[r][c] = true;
        // 判断初始坐标上下左右是否满足条件,满足条件则递归标记访问
        for (int i = 0; i < 4; i++)
        {
            int x = r + dr[i];
            int y = c + dc[i];
            if (x >= 0 && x < m && y >= 0 && y < n && grid[x][y] == '1' && !visited[x][y])
            {
                dfs(grid, x, y);
            }
        }
    }

    // 坐标上下左右的偏移量
    int dr[4] = { -1,1,0,0 };
    int dc[4] = { 0,0,-1,1 };

    int m;
    int n;
    vector<vector<bool>> visited; // 标记坐标是否被访问过
};

3. 岛屿的最大面积(中等)

3.1 BFS

class Solution {
public:
    int maxAreaOfIsland(vector<vector<int>>& grid) {
        m = grid.size();
        n = grid[0].size();
        visited.resize(m, vector<bool>(n));
        int ans = 0;

        for (int i = 0; i < m; i++)
        {
            for (int j = 0; j < n; j++)
            {
                if (grid[i][j] == 1 && !visited[i][j])
                {
                    ans = max(ans, bfs(grid, i, j));
                }
            }
        }
        return ans;
    }

private:
    int bfs(vector<vector<int>>& grid, int r, int c)
    {
        int area = 0; // 这块岛屿的面积
        queue<pair<int, int>> q;
        // 初始坐标入队并标记并且面积++
        q.push({r, c});
        visited[r][c] = true;
        area++;
        while (!q.empty())
        {
            // 队头出队
            auto [row, col] = q.front();
            q.pop();
            // 判断刚才出队的坐标上下左右是否满足条件,满足条件则入队并标记并且面积++
            for (int i = 0; i < 4; i++)
            {
                int x = row + dr[i];
                int y = col + dc[i];
                if (x >= 0 && x < m && y >= 0 && y < n && grid[x][y] == 1 && !visited[x][y])
                {
                    q.push({x, y});
                    visited[x][y] = true;
                    area++;
                }
            }
        }
        return area;
    }

    // 坐标上下左右的偏移量
    int dr[4] = { -1,1,0,0 };
    int dc[4] = { 0,0,-1,1 };

    int m;
    int n;
    vector<vector<bool>> visited; // 标记坐标是否被访问过
};

3.2 DFS

class Solution {
public:
    int maxAreaOfIsland(vector<vector<int>>& grid) {
        m = grid.size();
        n = grid[0].size();
        visited.resize(m, vector<bool>(n));
        int ans = 0;

        for (int i = 0; i < m; i++)
        {
            for (int j = 0; j < n; j++)
            {
                if (grid[i][j] == 1 && !visited[i][j])
                {
                    ans = max(ans, dfs(grid, i, j));
                }
            }
        }
        return ans;
    }

private:
    int dfs(vector<vector<int>>& grid, int r, int c)
    {
        int area = 0; // 这块岛屿的面积
        // 初始坐标标记访问
        visited[r][c] = true;
        area++;
        // 判断初始坐标上下左右是否满足条件,满足条件则递归标记访问
        for (int i = 0; i < 4; i++)
        {
            int x = r + dr[i];
            int y = c + dc[i];
            if (x >= 0 && x < m && y >= 0 && y < n && grid[x][y] == 1 && !visited[x][y])
            {
                area += dfs(grid, x, y);
            }
        }
        return area;
    }

    // 坐标上下左右的偏移量
    int dr[4] = { -1,1,0,0 };
    int dc[4] = { 0,0,-1,1 };

    int m;
    int n;
    vector<vector<bool>> visited; // 标记坐标是否被访问过
};

4. 被围绕的区域(中等)

先处理边界上的'O'连通块,把它们修改成非'O'非'X'的字符,例如字符'a'。

再遍历矩阵,如果遍历到'a',说明它属于边界上的'O'连通块,把'a'还原成'O';如果遍历到'O',说明它属于被'X'围绕的'O'连通块,把'O'修改成'X'。

4.1 BFS

class Solution {
public:
    void solve(vector<vector<char>>& board) {
        m = board.size();
        n = board[0].size();

        // 先处理边界上的'O'连通块
        for (int i = 0; i < m; i++)
        {
            if (board[i][0] == 'O')
            {
                bfs(board, i, 0);
            }
            if (board[i][n - 1] == 'O')
            {
                bfs(board, i, n - 1);
            }
        }
        for (int j = 0; j < n; j++)
        {
            if (board[0][j] == 'O')
            {
                bfs(board, 0, j);
            }
            if (board[m - 1][j] == 'O')
            {
                bfs(board, m - 1, j);
            }
        }

        // 再遍历矩阵,修改
        for (int i = 0; i < m; i++)
        {
            for (int j = 0; j < n; j++)
            {
                if (board[i][j] == 'a')
                {
                    board[i][j] = 'O';
                }
                else if (board[i][j] == 'O')
                {
                    board[i][j] = 'X';
                }
            }
        }
    }

private:
    void bfs(vector<vector<char>>& board, int r, int c)
    {
        queue<pair<int, int>> q;
        // 初始坐标入队并修改元素值
        q.push({r, c});
        board[r][c] = 'a';
        while (!q.empty())
        {
            // 队头出队
            auto [row, col] = q.front();
            q.pop();
            // 判断刚才出队的坐标上下左右是否满足条件,满足条件则入队并修改元素值
            for (int i = 0; i < 4; i++)
            {
                int x = row + dr[i];
                int y = col + dc[i];
                if (x >= 0 && x < m && y >= 0 && y < n && board[x][y] == 'O')
                {
                    q.push({x, y});
                    board[x][y] = 'a';
                }
            }
        }
    }

    // 坐标上下左右的偏移量
    int dr[4] = { -1,1,0,0 };
    int dc[4] = { 0,0,-1,1 };

    int m;
    int n;
};

4.2 DFS

class Solution {
public:
    void solve(vector<vector<char>>& board) {
        m = board.size();
        n = board[0].size();

        // 先处理边界上的'O'连通块
        for (int i = 0; i < m; i++)
        {
            if (board[i][0] == 'O')
            {
                dfs(board, i, 0);
            }
            if (board[i][n - 1] == 'O')
            {
                dfs(board, i, n - 1);
            }
        }
        for (int j = 0; j < n; j++)
        {
            if (board[0][j] == 'O')
            {
                dfs(board, 0, j);
            }
            if (board[m - 1][j] == 'O')
            {
                dfs(board, m - 1, j);
            }
        }

        // 再遍历矩阵,修改
        for (int i = 0; i < m; i++)
        {
            for (int j = 0; j < n; j++)
            {
                if (board[i][j] == 'a')
                {
                    board[i][j] = 'O';
                }
                else if (board[i][j] == 'O')
                {
                    board[i][j] = 'X';
                }
            }
        }
    }

private:
    void dfs(vector<vector<char>>& board, int r, int c)
    {
        // 初始坐标修改元素值
        board[r][c] = 'a';
        // 判断初始坐标上下左右是否满足条件,满足条件则递归修改元素值
        for (int i = 0; i < 4; i++)
        {
            int x = r + dr[i];
            int y = c + dc[i];
            if (x >= 0 && x < m && y >= 0 && y < n && board[x][y] == 'O')
            {
                dfs(board, x, y);
            }
        }
    }

    // 坐标上下左右的偏移量
    int dr[4] = { -1,1,0,0 };
    int dc[4] = { 0,0,-1,1 };

    int m;
    int n;
};

5. 飞地的数量(中等)

和上一题“被围绕的区域”类似。

先处理边界上的1连通块,把它们修改成非0非1的整型,例如2。

再遍历矩阵,如果遍历到2,说明它属于边界上的1连通块,把2还原成1;如果遍历到1,说明它属于被0围绕的1连通块,计算数量。

5.1 BFS

class Solution {
public:
    int numEnclaves(vector<vector<int>>& grid) {
        m = grid.size();
        n = grid[0].size();

        // 先处理边界上的1连通块
        for (int i = 0; i < m; i++)
        {
            if (grid[i][0] == 1)
            {
                bfs(grid, i, 0);
            }
            if (grid[i][n - 1] == 1)
            {
                bfs(grid, i, n - 1);
            }
        }
        for (int j = 0; j < n; j++)
        {
            if (grid[0][j] == 1)
            {
                bfs(grid, 0, j);
            }
            if (grid[m - 1][j] == 1)
            {
                bfs(grid, m - 1, j);
            }
        }

        // 再遍历矩阵,遍历到2则修改成1,遍历到1则计数
        int ans = 0;
        for (int i = 0; i < m; i++)
        {
            for (int j = 0; j < n; j++)
            {
                if (grid[i][j] == 2)
                {
                    grid[i][j] = 1;
                }
                else if (grid[i][j] == 1)
                {
                    ans++;
                }
            }
        }
        return ans;
    }

private:
    void bfs(vector<vector<int>>& grid, int r, int c)
    {
        queue<pair<int, int>> q;
        // 初始坐标入队并修改元素值
        q.push({r, c});
        grid[r][c] = 2;
        while (!q.empty())
        {
            // 队头出队
            auto [row, col] = q.front();
            q.pop();
            // 判断刚才出队的坐标上下左右是否满足条件,满足条件则入队并修改元素值
            for (int i = 0; i < 4; i++)
            {
                int x = row + dr[i];
                int y = col + dc[i];
                if (x >= 0 && x < m && y >= 0 && y < n && grid[x][y] == 1)
                {
                    q.push({x, y});
                    grid[x][y] = 2;
                }
            }
        }
    }

    // 坐标上下左右的偏移量
    int dr[4] = { -1,1,0,0 };
    int dc[4] = { 0,0,-1,1 };

    int m;
    int n;
};

5.2 DFS

class Solution {
public:
    int numEnclaves(vector<vector<int>>& grid) {
        m = grid.size();
        n = grid[0].size();

        // 先处理边界上的1连通块
        for (int i = 0; i < m; i++)
        {
            if (grid[i][0] == 1)
            {
                dfs(grid, i, 0);
            }
            if (grid[i][n - 1] == 1)
            {
                dfs(grid, i, n - 1);
            }
        }
        for (int j = 0; j < n; j++)
        {
            if (grid[0][j] == 1)
            {
                dfs(grid, 0, j);
            }
            if (grid[m - 1][j] == 1)
            {
                dfs(grid, m - 1, j);
            }
        }

        // 再遍历矩阵,遍历到2则修改成1,遍历到1则计数
        int ans = 0;
        for (int i = 0; i < m; i++)
        {
            for (int j = 0; j < n; j++)
            {
                if (grid[i][j] == 2)
                {
                    grid[i][j] = 1;
                }
                else if (grid[i][j] == 1)
                {
                    ans++;
                }
            }
        }
        return ans;
    }

private:
    void dfs(vector<vector<int>>& grid, int r, int c)
    {
        // 初始坐标修改元素值
        grid[r][c] = 2;
        // 判断初始坐标上下左右是否满足条件,满足条件则递归修改元素值
        for (int i = 0; i < 4; i++)
        {
            int x = r + dr[i];
            int y = c + dc[i];
            if (x >= 0 && x < m && y >= 0 && y < n && grid[x][y] == 1)
            {
                dfs(grid, x, y);
            }
        }
    }

    // 坐标上下左右的偏移量
    int dr[4] = { -1,1,0,0 };
    int dc[4] = { 0,0,-1,1 };

    int m;
    int n;
};

6. 太平洋大西洋水流问题(中等)

正难则反。如果直接去判断某个坐标的雨水是否既能流到太平洋又能流到大西洋,会重复遍历每个坐标。我们可以从矩阵的边界开始反向搜索寻找雨水流向边界的单元格,反向搜索时,每次只能移动到高度相同或更大的单元格。

从太平洋沿岸反向搜索,标记雨水可以流向太平洋的坐标;从大西洋沿岸反向搜索,标记雨水可以流向大西洋的坐标。那么,被标记两次的坐标,就是我们要找的结果。

6.1 BFS

class Solution {
public:
    vector<vector<int>> pacificAtlantic(vector<vector<int>>& heights) {
        m = heights.size();
        n = heights[0].size();
        vector<vector<bool>> pac(m, vector<bool>(n)); // 标记雨水能否流到太平洋
        vector<vector<bool>> atl(m, vector<bool>(n)); // 标记雨水能否流到大西洋

        // 从太平洋沿岸搜索
        for (int i = 0; i < m; i++)
        {
            bfs(heights, i, 0, pac);
        }
        for (int j = 0; j < n; j++)
        {
            bfs(heights, 0, j, pac);
        }
        // 从大西洋沿岸搜索
        for (int i = 0; i < m; i++)
        {
            bfs(heights, i, n - 1, atl);
        }
        for (int j = 0; j < n; j++)
        {
            bfs(heights, m - 1, j, atl);
        }

        vector<vector<int>> ans;
        for (int i = 0; i < m; i++)
        {
            for (int j = 0; j < n; j++)
            {
                if (pac[i][j] && atl[i][j])
                {
                    ans.push_back({i, j});
                }
            }
        }
        return ans;
    }

private:
    void bfs(vector<vector<int>>& heights, int r, int c, vector<vector<bool>>& visited)
    {
        queue<pair<int, int>> q;
        // 初始坐标入队并标记访问
        q.push({r, c});
        visited[r][c] = true;
        while (!q.empty())
        {
            // 队头出队
            auto [row, col] = q.front();
            q.pop();
            // 判断刚才出队的坐标上下左右是否满足条件,满足条件则入队并标记访问
            for (int i = 0; i < 4; i++)
            {
                int x = row + dr[i];
                int y = col + dc[i];
                if (x >= 0 && x < m && y >= 0 && y < n && !visited[x][y] && heights[x][y] >= heights[row][col])
                {
                    q.push({x, y});
                    visited[x][y] = true;
                }
            }
        }
    }

    // 坐标上下左右的偏移量
    int dr[4] = { -1,1,0,0 };
    int dc[4] = { 0,0,-1,1 };

    int m;
    int n;
};

6.2 DFS

class Solution {
public:
    vector<vector<int>> pacificAtlantic(vector<vector<int>>& heights) {
        m = heights.size();
        n = heights[0].size();
        vector<vector<bool>> pac(m, vector<bool>(n)); // 标记雨水能否流到太平洋
        vector<vector<bool>> atl(m, vector<bool>(n)); // 标记雨水能否流到大西洋

        // 从太平洋沿岸搜索
        for (int i = 0; i < m; i++)
        {
            dfs(heights, i, 0, pac);
        }
        for (int j = 0; j < n; j++)
        {
            dfs(heights, 0, j, pac);
        }
        // 从大西洋沿岸搜索
        for (int i = 0; i < m; i++)
        {
            dfs(heights, i, n - 1, atl);
        }
        for (int j = 0; j < n; j++)
        {
            dfs(heights, m - 1, j, atl);
        }

        vector<vector<int>> ans;
        for (int i = 0; i < m; i++)
        {
            for (int j = 0; j < n; j++)
            {
                if (pac[i][j] && atl[i][j])
                {
                    ans.push_back({i, j});
                }
            }
        }
        return ans;
    }

private:
    void dfs(vector<vector<int>>& heights, int r, int c, vector<vector<bool>>& visited)
    {
        // 初始坐标标记访问
        visited[r][c] = true;
        // 判断初始坐标上下左右是否满足条件,满足条件则递归标记访问
        for (int i = 0; i < 4; i++)
        {
            int x = r + dr[i];
            int y = c + dc[i];
            if (x >= 0 && x < m && y >= 0 && y < n && !visited[x][y] && heights[x][y] >= heights[r][c])
            {
                dfs(heights, x, y, visited);
            }
        }
    }

    // 坐标上下左右的偏移量
    int dr[4] = { -1,1,0,0 };
    int dc[4] = { 0,0,-1,1 };

    int m;
    int n;
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/595079.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《从Paxos到Zookeeper》——第五、六章:经典应用场景

目录 第五章 使用Zookeeper 5.1 服务端部署与运行 5.2 客户端相关 5.2.1 客户端运行 5.2.2 客户端命令 5.3 Java客户端API 5.4 开源客户端 第六章 经典应用场景 6.1 典型应用场景及实现 6.1.1 数据发布/订阅&#xff08;全局配置中心&#xff09; 6.1.2 负载均衡&#xff08;Lo…

ChatGPT Web Midjourney一键集成最新版

准备工具 服务器一台 推荐使用浪浪云服务器 稳定 安全 有保障 chatgpt api 推荐好用白嫖的api 项目演示 项目部署 浏览器访问casaos 添加软件原添加 https://gitee.com/langlangy_1/CasaOS-AppStore-LangLangy/raw/master/chatmjd.zip 安装此软件 等待安装 安装后再桌面设置…

什么是模版方法模式,有哪些应用?

模板方法模式是一种行为设计模式&#xff0c;他的主要作用就是复用代码。在很多时候&#xff0c;我们的代码中可能会有-些公共的部分并且还有一些定制的部分&#xff0c;那么公共这部分就可以定义在一个父类中&#xff0c;然后将定制的部分实现在子类中。这样子类可以根据需要扩…

TRIZ理论助力充电桩产业跨越技术瓶颈,实现产业升级!

随着新能源汽车市场的迅猛发展和电动汽车保有量的不断增加&#xff0c;充电桩作为电动汽车的“能量补给站”&#xff0c;其重要性日益凸显。然而&#xff0c;充电桩产业在发展过程中也面临着诸多技术瓶颈&#xff0c;如何突破这些瓶颈&#xff0c;推动充电桩产业升级成为行业亟…

《Video Mamba Suite》论文笔记(2)Mamba对于多模态交互的作用

原文翻译 4.2 Mamba for Cross-Modal Interaction Tasks and datasets.除了单模态任务外&#xff0c;我们还评估了 Mamba 在跨模态交互方面的性能。我们首先使用视频时间定位 (Video Temporal Grounding) 任务进行评估。所涉及的数据集包含 QvHighlight [44] 和 Charade-STA …

Vue阶段练习:初始化渲染、获取焦点、记账清单

阶段练习主要承接Vue 生命周期-CSDN博客 &#xff0c;学习完该部分内容后&#xff0c;进行自我检测&#xff0c;每个练习主要分为效果显示、需求分析、静态代码、完整代码、总结 四个部分&#xff0c;效果显示和准备代码已给出&#xff0c;我们需要完成“完整代码”部分。 练习…

交直流充电桩测试系统解决方案,你了解多少?

交直流充电桩测试系统是电动汽车充电设施的重要组成部分&#xff0c;它对充电桩的性能、安全性和可靠性进行全方位的检测和评估。随着电动汽车的普及&#xff0c;充电桩测试系统的需求也在不断增加。本文将对交直流充电桩测试系统的解决方案进行简要介绍。 1. 系统组成 交直流…

微信小程序如何使用svg矢量图标

微信小程序如何使用自定义SVG矢量图标 在微信小程序中&#xff0c;经常会用到小图标来装饰界面&#xff0c;我们常用的方法就是引用第三方的图标&#xff0c;但会存在收费或者找不到合适的图标&#xff0c;这时候我建议可以自行编写svg图标代码&#xff0c;就可以随心所欲的使…

纯干货,源代码防泄密之环境加密与文档加密的区别

环境加密和文档加密是两种不同的数据保护方法&#xff0c;下面用SDC沙盒及文档加密系统作对比&#xff0c;它们在设计理念、管控对象、安全性、性能以及适用场景等方面有所区别&#xff1a; 来百度APP畅享高清图片 1、设计理念&#xff1a; 环境加密&#xff08;如SDC沙盒&am…

JavaScript继承的方法和优缺点

原型链继承 让一个构造函数的原型是另一个类型的实例&#xff0c;那么这个构造函数new出来的实例就具有该实例的属性。 优点&#xff1a; 写法方便简洁&#xff0c;容易理解。 缺点&#xff1a; 在父类型构造函数中定义的引用类型值的实例属性&#xff0c;会在子类型原型上…

华中科技大学雷达站部署

一&#xff1a;项目地址 GitHub - HUSTLYRM/HUST_Radar_2023: 华中科技大学狼牙战队 RoboMaster 2023赛季 雷达站 二&#xff1a;安装依赖 2.1创建虚拟环境 首先是程序是基于python3.8完成&#xff0c;所以创建虚拟环境的时候&#xff0c;选择3.8的虚拟环境 conda create -…

【算法刷题日志】吸氧羊的StarryCoding之旅 - 贡献法计算

题目链接&#xff1a;https://www.starrycoding.com/problem/3 题目描述 吸氧羊终于注册了一个StarryCoding账号&#xff01;&#xff08;她很开心&#xff09; 但是吸氧羊忘记了它的密码&#xff0c;她想起你是计算机大师&#xff0c;于是就来请教你。 她虽然不记得密码了…

nacos开启登录开关启动报错“Unable to start embedded Tomcat”

nacos 版本&#xff1a;2.3.2 2.2.2版本之前的Nacos默认控制台&#xff0c;无论服务端是否开启鉴权&#xff0c;都会存在一个登录页&#xff1b;在之后的版本关闭了默认登录页面&#xff0c;无需登录直接进入控制台操作。在这里我们可以在官网可以看到相关介绍 而我现在所用的…

中国各地级市城投债详细数据(2006年-2023年2月)

01、数据简介 城投债又称为准市政债&#xff0c;发行主体是地方ZF投资平台&#xff0c;公开发行企业债和中期票据&#xff0c;其业主一般是地方基础设施建设&#xff0c;或者公益性项目主体&#xff0c;参与债券发行环节的当地ZF发债。 数据整理中国各地级市的城投债详细数据…

opencv图片的旋转-------c++

图片的旋转 /// <summary> /// 图片的旋转 /// </summary> /// <param name"img"></param> /// <param name"angle">旋转角度:正数&#xff0c;则表示逆时针旋转;负数&#xff0c;则表示顺时针旋转</param> /// <…

【intro】图卷积神经网络(GCN)

本文为Graph Neural Networks(GNN)学习笔记-CSDN博客后续&#xff0c;内容为GCN论文阅读&#xff0c;相关博客阅读&#xff0c;kaggle上相关的数据集/文章/代码的阅读三部分&#xff0c;考虑到本人是GNN新手&#xff0c;会先从相关博客开始&#xff0c;进一步看kaggle&#xff…

考虑极端天气线路脆弱性的配电网分布式电源和储能优化配置模型

1 主要内容 程序主要参考《考虑极端天气线路脆弱性的配电网分布式电源配置优化模型-马宇帆》&#xff0c;针对极端天气严重威胁配电网安全稳定运行的问题。基于微气象、微地形对配电网的线路脆弱性进行分析&#xff0c;然后进行分布式电源接入位置与极端天气的关联性分析&…

优优嗨聚集团:法律明灯,个债处理中的法律咨询力量

在现代社会&#xff0c;个人债务问题日益突出&#xff0c;无论是因生活消费、投资失利还是其他原因&#xff0c;债务问题都可能成为个人财务的一大负担。面对复杂的债务困境&#xff0c;许多人感到迷茫和无助。此时&#xff0c;法律咨询如同一盏明灯&#xff0c;能够为个人债务…

Docker 安装部署 postgres

Docker 安装部署 postgres 1、拉取 postgres 镜像文件 [rootiZbp19a67kznq0h0rgosuxZ ~]# docker pull postgres:latest latest: Pulling from library/postgres b0a0cf830b12: Pull complete dda3d8fbd5ed: Pull complete 283a477db7bb: Pull complete 91d2729fa4d5: Pul…

自动化测试 selenium基础

前言 我们都知道测试开发工程师的任务是根据用户需求测试用例的同时,害的开发自动化工具来减轻测试压力且提高测试的效率以及质量,这一节我们就来简单谈谈开发简单的自动化工具基础 什么是自动化测试呢?就是将我们需要做的测试交给机器去做,也就是使用代码来模拟人对于机器的行…
最新文章