模板套用
大家发现 都是套用一个模板
剑指 Offer II 105. 岛屿的最大面积
class Solution {
public int maxAreaOfIsland(int[][] grid) {
int ans = 0;
for(int i = 0; i < grid.length; i++){
for(int j = 0; j < grid[0].length; j++){
if(grid[i][j] == 1){
ans = Math.max(ans, dfs(grid, i, j));
}
}
}
return ans;
}
public int dfs(int[][] grid, int x, int y){
if(x < 0 || y < 0 || x >= grid.length || y >= grid[0].length || grid[x][y] == 0){
return 0;
}
grid[x][y] = 0;
int sum = 1;
sum += dfs(grid, x + 1, y);
sum += dfs(grid, x - 1, y);
sum += dfs(grid, x, y - 1);
sum += dfs(grid, x, y + 1);
return sum;
}
}
class Solution {
int[][] grid;
boolean[][] used;
int m;
int n;
int[][] DIRECTION = {{-1, 0}, {1, 0}, {0, 1}, {0, -1}};
public int maxAreaOfIsland(int[][] grid) {
this.m = grid.length;
this.n = grid[0].length;
this.grid = grid;
this.used = new boolean[m][n];
int ans = 0;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (grid[i][j] == 1 && used[i][j] == false) {
ans = Math.max(ans, dfs(i, j));
}
}
}
return ans;
}
private int dfs(int i, int j) {
used[i][j] = true;
int ans = 1;
for (int[] d : DIRECTION) {
int x = i + d[0];
int y = j + d[1];
if(x >= 0 && x < m && y >= 0 && y < n && used[x][y] == false && grid[x][y] == 1){
ans += dfs(x, y);
used[x][y] = true;
}
}
return ans;
}
}
200. 岛屿数量
public int numIslands(char[][] grid) {
int count = 0;
for (int i = 0; i < grid.length; i++) {
for (int j = 0; j < grid[0].length; j++) {
if(grid[i][j] == '1'){
count++;
dfs(grid, i, j);
}
}
}
return count;
}
private void dfs(char[][] grid, int i, int j) {
if(i < 0 || i >= grid.length || j < 0 || j >= grid[0].length || 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);
}
class Solution {
int m;
int n;
char[][] grid;
boolean[][] used;
int[][] DIRECTION = {{-1, 0}, {1, 0}, {0, 1}, {0, -1}};
public int numIslands(char[][] grid) {
this.m = grid.length;
this.n = grid[0].length;
this.grid = grid;
used = new boolean[m][n];
int ans = 0;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (used[i][j] == false && grid[i][j] == '1') {
dfs(i, j);
ans++;
}
}
}
return ans;
}
private void dfs(int i, int j) {
used[i][j] = true;
int ans = 1;
for (int[] d : DIRECTION) {
int x = i + d[0];
int y = j + d[1];
if (x >= 0 && x < m && y >= 0 && y < n && grid[x][y] == '1' && used[x][y] == false){
used[x][y] = true;
dfs(x, y);
}
}
}
}
面试题 16.19. 水域大小
public int[] pondSizes(int[][] land) {
List<Integer> res = new ArrayList<>();
for (int i = 0; i < land.length; i++) {
for (int j = 0; j < land[0].length; j++) {
if (land[i][j] == 0) {
int count = dfs(land, i, j);
res.add(count);
}
}
}
int[] ans = new int[res.size()];
for (int i = 0; i < ans.length; i++) {
ans[i] = res.get(i);
}
return ans;
}
private int dfs(int[][] land, int i, int j) {
if (i < 0 || i >= land.length || j < 0 || j >= land[0].length || land[i][j] != 0) {
return 0;
}
land[i][j] = -1;
int ans = 1;
ans += dfs(land, i - 1, j);
ans += dfs(land, i + 1, j);
ans += dfs(land, i, j - 1);
ans += dfs(land, i, j + 1);
ans += dfs(land, i - 1, j + 1);
ans += dfs(land, i - 1, j - 1);
ans += dfs(land, i + 1, j + 1);
ans += dfs(land, i + 1, j - 1);
return ans;
}
class Solution {
int m;
int n;
int[][] land;
boolean[][] used;
int[][] DIRECTION = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}, {1,1}, {1, -1}, {-1, 1}, {-1, -1}};
public int[] pondSizes(int[][] land) {
this.m = land.length;
this.n = land[0].length;
this.land = land;
this.used = new boolean[m][n];
List<Integer> list = new ArrayList<>();
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if(land[i][j] == 0 && used[i][j] == false){
int ans = dfs(i, j);
list.add(ans);
}
}
}
int[] res = new int[list.size()];
for (int i = 0; i < list.size(); i++) {
res[i] = list.get(i);
}
return res;
}
private int dfs(int i, int j) {
used[i][j] = true;
int ans = 1;
for (int[] d : DIRECTION){
int x = i + d[0];
int y = j + d[1];
if(x >= 0 && x < m && y >= 0 && y < n && used[x][y] == false && land[x][y] == 0){
ans += dfs(x, y);
}
}
return ans;
}
}
剑指 Offer 12. 矩阵中的路径
这里需要回溯
class Solution {
public boolean exist(char[][] board, String word) {
char[] str = word.toCharArray();
for (int i = 0; i < board.length; i++) {
for (int j = 0; j < board[0].length; j++) {
if(dfs(board, str, i, j, 0)){
return true;
}
}
}
return false;
}
private boolean dfs(char[][] board, char[] str, int i, int j, int index) {
if(i < 0 || i >= board.length || j < 0 || j >= board[0].length || board[i][j] != str[index]){
return false;
}
if(index == str.length - 1){
return true;
}
board[i][j] = ' ';
boolean res = dfs(board, str, i + 1, j, index + 1) || dfs(board, str, i - 1, j, index + 1)
|| dfs(board, str, i, j + 1, index + 1) ||dfs(board, str, i, j - 1, index + 1);
board[i][j] = str[index];
return res;
}
}
2328. 网格图中递增路径的数目
int[][] cache;
long mod = (long) (1e9 + 7);
public int countPaths(int[][] grid) {
cache = new int[grid.length][grid[0].length];
for (int i = 0; i < cache.length; i++) {
Arrays.fill(cache[i], -1);
}
long ans = 0;
for (int i = 0; i < grid.length; i++) {
for (int j = 0; j < grid[0].length; j++) {
ans = (ans + dfs(grid, i, j)) % mod;
}
}
return (int) ans;
}
private long dfs(int[][] grid, int i, int j) {
if (cache[i][j] != -1) {
return cache[i][j];
}
if (i < 0 || i >= grid.length || j < 0 || j >= grid[0].length) {
return 0;
}
long ans = 1;
int m = grid.length;
int n = grid[0].length;
if (i < m - 1 && grid[i + 1][j] > grid[i][j]) {
ans = (ans + dfs(grid, i + 1, j)) % mod;
}
if (i >= 1 && grid[i - 1][j] > grid[i][j]) {
ans = (ans + dfs(grid, i - 1, j)) % mod;
}
if (j >= 1 && grid[i][j - 1] > grid[i][j]) {
ans = (ans + dfs(grid, i, j - 1)) % mod;
}
if (j < n - 1 && grid[i][j + 1] > grid[i][j]) {
ans = (ans + dfs(grid, i, j + 1)) % mod;
}
cache[i][j] = (int) ans;
return ans;
}
class Solution {
int m;
int n;
int[][] grid;
int[][] arr;
long mod = (long) (1e9 + 7);
int[][] DIRECTION = {{-1, 0}, {1, 0}, {0, 1}, {0, -1}};
public int countPaths(int[][] grid) {
this.arr = new int[grid.length][grid[0].length];
this.grid = grid;
for (int[] arr1 : arr){
Arrays.fill(arr1, -1);
}
this.m = grid.length;
this.n = grid[0].length;
long ans = 0;
for (int i = 0; i < grid.length; i++) {
for (int j = 0; j < grid[0].length; j++) {
ans = (ans + dfs(i, j)) % mod;
}
}
return (int) ans;
}
private long dfs(int i, int j) {
if(arr[i][j] != -1){
return arr[i][j];
}
long ans = 1;
for (int[] d : DIRECTION){
int x = i + d[0];
int y = j + d[1];
if(x >= 0 && x < m && y >= 0 && y < n && grid[i][j] < grid[x][y]){
ans = (ans + dfs(x, y)) % mod;
}
}
arr[i][j] = (int) ans;
return ans;
}
}
转载标明 本网址 ~ ! https://blog.csdn.net/bijian0530/article/details/125634557