提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
dfs和bfs
一、力扣84. 柱状图中最大的矩形
class Solution {
public int largestRectangleArea(int[] heights) {
int[] arr = new int[heights.length+2];
int res = 0;
for(int i = 0; i < heights.length; i ++){
arr[i+1] = heights[i];
}
Deque<Integer> deq = new LinkedList<>();
deq.offerLast(0);
for(int i = 1; i < arr.length; i ++){
if(arr[i] >= arr[deq.peekLast()]){
deq.offerLast(i);
}else{
while(arr[i] < arr[deq.peekLast()]){
int right = i;
int mid = deq.pollLast();
int left = deq.peekLast();
int w = right - left -1;
int h = arr[mid];
res = Math.max(res, w * h);
}
deq.offerLast(i);
}
}
return res;
}
}
二、力扣797. 所有可能的路径
class Solution {
List<List<Integer>> res = new ArrayList<>();
List<Integer> path = new ArrayList();
boolean[] flag;
public List<List<Integer>> allPathsSourceTarget(int[][] graph) {
flag = new boolean[graph.length];
path.add(0);
flag[0] = true;
dfs(graph,0);
return res;
}
public void dfs(int[][] graph, int cur){
if(cur == graph.length-1){
res.add(new ArrayList<>(path));
return;
}
for(int i = 0; i < graph[cur].length; i ++){
int index = graph[cur][i];
if(flag[index]){
continue;
}
flag[index] = true;
path.add(index);
dfs(graph,index);
flag[index] = false;
path.remove(path.size()-1);
}
}
}
三、力扣「代码随想录」DFS,BDF 你没注意的细节都给你列出来了!
class Solution {
public int numIslands(char[][] grid) {
int res = 0;
int m = grid.length, n = grid[0].length;
boolean[][] flag = new boolean[m][n];
int[][] dir = new int[][]{{0,1},{0,-1},{-1,0},{1,0}};
Deque<int[]> deq = new LinkedList<>();
for(int i = 0; i < m; i ++){
for(int j = 0; j < n; j ++){
if(!flag[i][j]){
if(grid[i][j] == '1'){
deq.offerLast(new int[]{i,j});
flag[i][j] = true;
res ++;
while(!deq.isEmpty()){
int[] cur = deq.pollFirst();
for(int k = 0; k < 4; k ++){
int x = cur[0] + dir[k][0];
int y = cur[1] + dir[k][1];
if(x < 0 || x >= m || y < 0 || y >= n){
continue;
}
if(grid[x][y] == '1' && !flag[x][y]){
deq.offerLast(new int[]{x,y});
flag[x][y] = true;
}
}
}
}else{
flag[i][j] = true;
}
}
}
}
return res;
}
}
四、力扣200. 岛屿数量
class Solution {
boolean[][] flag;
int[][] arr = new int[][]{{0,1},{0,-1},{-1,0},{1,0}};
public int numIslands(char[][] grid) {
int res = 0;
int m = grid.length, n = grid[0].length;
flag = new boolean[m][n];
for(int i = 0; i < m; i ++){
for(int j = 0; j < n; j ++){
if(!flag[i][j] && grid[i][j] == '1'){
res ++;
flag[i][j] = true;
dfs(grid,i,j);
}
}
}
return res;
}
public void dfs(char[][] grid, int x , int y){
for(int i = 0; i < 4; i ++){
int curX = x + arr[i][0];
int curY = y + arr[i][1];
if(curX < 0 || curX >= grid.length || curY < 0 || curY >= grid[0].length){
continue;
}
if(!flag[curX][curY] && grid[curX][curY] == '1'){
flag[curX][curY] = true;
dfs(grid,curX,curY);
}
}
}
}
力扣编程题目解析:最大矩形、路径探索与岛屿计数算法
866

被折叠的 条评论
为什么被折叠?



