持续创作,加速成长!这是我参与「掘金日新计划 · 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);
}
};