力扣(1)

123 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第21天,点击查看活动详情

463. 岛屿的周长

思路:

代码:

class Solution {
public:
    int islandPerimeter(vector<vector<int>>& grid) {
        
        for(int i=0; i<grid.size(); i++){
            for(int j=0; j<grid[0].size(); j++){
                if(grid[i][j]==1){
                     // 题目限制只有一个岛屿,计算一个即可
                    return dfs(grid, i, j);
                }
            }
        }
        return 0;
    }

    int dfs(vector<vector<int>>& grid, int i, int j){
        // 从一个岛屿方格走向网格边界,周长加 1
        if(!(i>=0 && i<grid.size() && j>=0 && j<grid[0].size())){
            return 1;
        }
         // 从一个岛屿方格走向水域方格,周长加 1
        if(grid[i][j]==0){
            return 1;
        }
          // 已遍历过(值为2)的岛屿在这里会直接返回,不会重复遍历
        if(grid[i][j]!=1){
            return 0;
        }
        grid[i][j]=2;
        return dfs(grid, i-1, j) + dfs(grid, i+1, j) + dfs(grid, i, j-1) + dfs(grid, i, j+1);
    }
};

剑指 Offer 12. 矩阵中的路径

思路:

代码:

class Solution {
public:
    bool exist(vector<vector<char>>& board, string word) {
        for (int i = 0; i < board.size(); i++) {
            for (int j = 0; j < board[i].size(); j++) {
                if (dfs(board, word, i, j, 0)) return true;
            }
        }return false;
    }

    bool dfs(vector<vector<char>> &board, string word, int i, int j, int index) {
        if (i < 0 || j < 0 || i >= board.size() || j >= board[i].size() || word[index] != board[i][j]) return false;

        if (index == word.size() - 1) return true;

        char tmp = board[i][j];
        board[i][j] = '-';

        bool s = dfs(board, word, i-1 , j, index + 1) ||dfs(board, word, i , j-1, index + 1) ||dfs(board, word, i +1, j, index + 1) ||dfs(board, word, i , j+1, index + 1) ;
        board[i][j] = tmp;
        return s;
    }
};

329. 矩阵中的最长递增路径

思路:

代码:

class Solution {
public:
    int ans = 0;
    int longestIncreasingPath(vector<vector<int>>& matrix) {
        int m = matrix.size(), n = matrix[0].size();
         vector<vector<int>>ret(m, vector<int>(n,0));
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                ans = max(ans, dfs(matrix, i, j, ret,-1));
            }
        }return ans;
    }

    int dfs(vector<vector<int>>&matrix, int i, int j, vector<vector<int>>&res, int pre) {
        if (i < 0 || j < 0 || i >= matrix.size() || j >= matrix[0].size() || pre >= matrix[i][j]) return 0;

        if (res[i][j]) return res[i][j];
        

        int left = dfs(matrix, i + 1, j, res, matrix[i][j]);
        int right = dfs(matrix, i - 1, j, res, matrix[i][j]);
        int top  = dfs(matrix, i, j + 1, res, matrix[i][j]);
        int button = dfs(matrix, i, j - 1, res, matrix[i][j]);

        int curmax = max(left,max(right, max(top,button))) + 1;
        res[i][j] = curmax;
        return curmax;

    }
};

79. 单词搜索

思路:

代码:

class Solution {
public:
    bool exist(vector<vector<char>>& board, string word) {
        for (int i = 0; i < board.size(); i++) {
            for (int j = 0; j < board[i].size(); j++) {
                if (dfs(board, word, i, j, 0)) return true;
            }
        }return false;
    }

    bool dfs(vector<vector<char>> &board, string word, int i, int j, int index) {
        if (i < 0 || j < 0 || i >= board.size() || j >= board[i].size() || word[index] != board[i][j]) return false;

        if (index == word.size() - 1) return true;

        char tmp = board[i][j];
        board[i][j] = '-';

        bool s = dfs(board, word, i-1 , j, index + 1) ||dfs(board, word, i , j-1, index + 1) ||dfs(board, word, i +1, j, index + 1) ||dfs(board, word, i , j+1, index + 1) ;
        board[i][j] = tmp;
        return s;
    }
};

200. 岛屿数量

思路:

代码:

class Solution {
public:
    int numIslands(vector<vector<char>>& grid) {
        int ans = 0;
        for (int i = 0; i < grid.size(); i++) {
            for (int j = 0; j < grid[i].size(); j++) {
                if (grid[i][j] == '1') {
                    dfs(grid, i , j);
                    ans++;
                }
            }
        }return ans;
    }

    void dfs(vector<vector<char>> &grid, int i, int j) {
        if (i < 0 || j < 0 || i >= grid.size() || j >= grid[i].size() || grid[i][j] == '0') return;

        grid[i][j] = '0';

        dfs(grid, i - 1, j);
        dfs(grid, i + 1, j);
        dfs(grid, i, j - 1);
        dfs(grid, i, j + 1);

    }
};