力扣-图论-13【算法学习day.63】

前言

###我做这类文章一个重要的目的还是给正在学习的大家提供方向和记录学习过程(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非常非常高滴!!!


习题

1.水域大小

题目链接: 面试题 16.19. 水域大小 - 力扣(LeetCode)

**分析:**简单的dfs

java 复制代码
class Solution {
    int[][] land;
    int n,m;
    int[][] flag;
    ArrayList<Integer> list = new ArrayList<>();
    int flag2 = 0;
    public int[] pondSizes(int[][] land) {
        this.land = land;
        n = land.length;
        m = land[0].length;
        flag = new int[n][m];
        for(int i = 0;i<n;i++){
            for(int j = 0;j<m;j++){
                if(flag[i][j]==0&&land[i][j]==0){
                flag2 = 0;
                recursion(i,j);
                //  System.out.println("------------------------");
                list.add(flag2);
                }
            }
        }
        flag2 = 0;
        int[] ans = new int[list.size()];
        for(int a:list){
           ans[flag2++] = a;
        }
        Arrays.sort(ans);
        return ans;
    }
    public void recursion(int x,int y){
        // System.out.println(x+"          "+y);
        flag[x][y] = 1;
        flag2++;
        if(x+1<n&&land[x+1][y]==0&&flag[x+1][y]==0){
            recursion(x+1,y);
        }
         if(x-1>=0&&land[x-1][y]==0&&flag[x-1][y]==0){
            recursion(x-1,y);
        }
         if(y+1<m&&land[x][y+1]==0&&flag[x][y+1]==0){
            recursion(x,y+1);
        }
         if(y-1>=0&&land[x][y-1]==0&&flag[x][y-1]==0){
            recursion(x,y-1);
        }
        if(x+1<n&&y+1<m&&land[x+1][y+1]==0&&flag[x+1][y+1]==0){
            recursion(x+1,y+1);
        }
        if(x+1<n&&y-1>=0&&land[x+1][y-1]==0&&flag[x+1][y-1]==0){
            recursion(x+1,y-1);
        }
        if(x-1>=0&&y+1<m&&land[x-1][y+1]==0&&flag[x-1][y+1]==0){
            recursion(x-1,y+1);
        }
        if(x-1>=0&&y-1>=0&&land[x-1][y-1]==0&&flag[x-1][y-1]==0){
            recursion(x-1,y-1);
        }
    }
}

2.主题空间

题目链接: LCS 03. 主题空间 - 力扣(LeetCode)

题面:

**分析:**dfs,只不过多一些考虑情况

代码:

java 复制代码
class Solution {
    int n,m;
    int ans = 0;
    char[][] map;
    int[][] flag;
    int flag2 = 0;
    int islian = 0;
    public int largestArea(String[] grid) {
        n = grid.length;
        m = grid[0].length();
        map = new char[n][m];
        flag = new int[n][m];
        int count = 0;
        for(String str:grid){
            map[count++] = str.toCharArray();
        }
        for(int i = 1;i<n-1;i++){
            for(int j = 1;j<m-1;j++){
                if(map[i][j]!='0'&&flag[i][j]==0){
                    flag2 = 0;
                    islian = 0;
                    recursion(i,j,map[i][j]);
                    if(islian==0){
                        ans = Math.max(ans,flag2);
                    }
                }
            }            
        }
        return ans;
    }
    public void recursion(int x,int y,char u){
        flag2++;
        flag[x][y] = 1;
        if(x==0||x==n-1||y==0||y==m-1)islian = 1;
        if(x+1<n){
            if(map[x+1][y]==u&&flag[x+1][y]==0){
             recursion(x+1,y,u);
            }
            if(map[x+1][y]=='0')islian=1;
        }
         if(x-1>=0){
            if(map[x-1][y]==u&&flag[x-1][y]==0){
                 recursion(x-1,y,u);
            }
            if(map[x-1][y]=='0')islian = 1;
           
        }
         if(y+1<m){
            if(map[x][y+1]==u&&flag[x][y+1]==0){
                recursion(x,y+1,u);
            }
            if(map[x][y+1]=='0')islian = 1;
        
        }
         if(y-1>=0){
            if(map[x][y-1]==u&&flag[x][y-1]==0){
                recursion(x,y-1,u);
            }
            if(map[x][y-1]=='0')islian = 1;
        }

    }
}

后言

上面是力扣图论专题,下一篇是其他的习题,希望有所帮助,一同进步,共勉!

相关推荐
大明者省35 分钟前
WSL2 Ubuntu22.04 GPU训练环境配置指南
人工智能·算法·计算机视觉
hsjiasb37 分钟前
FreeRTOS学习(二十六)——动态内存管理heap_1到heap_5
stm32·单片机·学习·学习笔记·freertos
崇子嵘42 分钟前
基于zynqMP15eg的linux驱动学习
学习
嘻哈∠※1 小时前
0061基于 SpringBoot 的投稿与稿件处理系统设计与实现
java·spring boot·后端
白狐_7982 小时前
408数据结构第8章:排序②——性质对比秒杀、场景选择与外部排序
java·数据结构·算法
zander2583 小时前
LeetCode 84:柱状图中的最大矩形——单调栈如何确定左右边界
java·数据结构·算法
知识分享小能手3 小时前
线性代数学习教程,从入门到精通,向量组的线性相关性 — 完整知识点梳理(7)
学习·线性代数·机器学习
码匠许师傅3 小时前
【C++ 面试真题】聊聊 C++ 的拷贝构造与拷贝赋值
java·c++·面试
Shell运维手记3 小时前
Linux 常用基础命令学习笔记
linux·运维·笔记·学习·算法·github
杨航 AI3 小时前
O(n log n):线性对数原理拆解 这个是排序算法的黄金复杂度之一。
算法·排序算法