代码随想录三刷day50

力扣编程题目解析:最大矩形、路径探索与岛屿计数算法

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言


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);
            }
        }
    }
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乱世在摸鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值