代码随想录-算法训练营day12【休息,复习与总结】

news2024/12/28 19:36:05

代码随想录-035期-算法训练营【博客笔记汇总表】-CSDN博客

● day 12 周日休息(4.14)

目录

复习与总结

0417_图论-太平洋大西洋水流问题

0827_图论-最大人工岛


复习与总结

二刷做题速度提升了一大截,ヾ(◍°∇°◍)ノ゙加油~

0417_图论-太平洋大西洋水流问题

//从太平洋边界开始DFS
for (int i = 0; i < m; i++) {//遍历第一行,从第一行开始
    dfs(matrix, canReachPacific, i, 0);
}
for (int j = 1; j < n; j++) {//遍历第一列,然后从第一列的第二个元素开始
    dfs(matrix, canReachPacific, 0, j);
}

//从大西洋边界开始DFS
for (int i = 0; i < m; i++) {//遍历最后一列,从最后一列开始
    dfs(matrix, canReachAtlantic, i, n - 1);
}
for (int j = 0; j < n - 1; j++) {//遍历最后一行,然后从最后一行的第一个元素开始
    dfs(matrix, canReachAtlantic, m - 1, j);
}

正确地遍历了太平洋和大西洋的边界。

  1. 对于太平洋来说,你从第一行开始,然后从第一列的第二个元素开始(因为第一个元素已经在第一行遍历过);
  2. 对于大西洋来说,你从最后一列开始,然后从最后一行的第一个元素开始(同样,最后一行的最后一个元素已经在最后一列遍历过)。

这种遍历边界的方法很好地处理了太平洋和大西洋的情况。

package com.question.solve.leetcode.programmerCarl._12_graphTheory;

import java.util.ArrayList;
import java.util.List;

public class _0417 {
}

class Solution0417 {
    public List<List<Integer>> pacificAtlantic(int[][] matrix) {
        List<List<Integer>> result = new ArrayList<>();
        if (matrix == null || matrix.length == 0 || matrix[0].length == 0) return result;

        int m = matrix.length, n = matrix[0].length;
        boolean[][] canReachPacific = new boolean[m][n];
        boolean[][] canReachAtlantic = new boolean[m][n];

        //从太平洋边界开始DFS
        for (int i = 0; i < m; i++) {//遍历第一行,从第一行开始
            dfs(matrix, canReachPacific, i, 0);
        }
        for (int j = 1; j < n; j++) {//遍历第一列,然后从第一列的第二个元素开始
            dfs(matrix, canReachPacific, 0, j);
        }

        //从大西洋边界开始DFS
        for (int i = 0; i < m; i++) {//遍历最后一列,从最后一列开始
            dfs(matrix, canReachAtlantic, i, n - 1);
        }
        for (int j = 0; j < n - 1; j++) {//遍历最后一行,然后从最后一行的第一个元素开始
            dfs(matrix, canReachAtlantic, m - 1, j);
        }

        //找到同时能够到达太平洋和大西洋的单元格
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (canReachPacific[i][j] && canReachAtlantic[i][j]) {
                    List<Integer> cell = new ArrayList<>();
                    cell.add(i);
                    cell.add(j);
                    result.add(cell);
                }
            }
        }
        return result;
    }

    private void dfs(int[][] matrix, boolean[][] canReach, int i, int j) {
        int m = matrix.length;
        int n = matrix[0].length;

        if (canReach[i][j]) return; //已经访问过该单元格

        canReach[i][j] = true; //标记为能够到达

        //搜索上下左右四个方向
        int[][] directions = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
        for (int[] dir : directions) {
            int x = i + dir[0];
            int y = j + dir[1];
            if (x >= 0 && x < m && y >= 0 && y < n && matrix[x][y] >= matrix[i][j]) {
                dfs(matrix, canReach, x, y);
            }
        }
    }

//    private void dfs(char[][] matrix, boolean[][] canReach, int i, int j) {
//        if (i < 0 || j < 0 || i >= matrix.length || j >= matrix[0].length || canReach[i][j]) return;
//        canReach[i][j] = true; //标记为能够到达
//        dfs(matrix, canReach, i + 1, j);
//        dfs(matrix, canReach, i - 1, j);
//        dfs(matrix, canReach, i, j + 1);
//        dfs(matrix, canReach, i, j - 1);
//    }
}

0827_图论-最大人工岛

LeetCode题解:https://leetcode.cn/problems/making-a-large-island/solutions/1830957/by-muse-77-37hi/

package com.question.solve.leetcode.programmerCarl._12_graphTheory;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

public class _0827_最大人工岛 {
}

class Solution0827 {
    private static final int[][] position = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};//四个方向

    /**
     * @param grid 矩阵数组
     * @param row  当前遍历的节点的行号
     * @param col  当前遍历的节点的列号
     * @param mark 当前区域的标记
     * @return 返回当前区域内 1 的数量
     */
    public int dfs(int[][] grid, int row, int col, int mark) {
        int ans = 0;
        grid[row][col] = mark;
        for (int[] current : position) {
            int curRow = row + current[0], curCol = col + current[1];
            if (curRow < 0 || curRow >= grid.length || curCol < 0 || curCol >= grid.length) continue;//越界
            if (grid[curRow][curCol] == 1)
                ans += 1 + dfs(grid, curRow, curCol, mark);
        }
        return ans;
    }

    public int largestIsland(int[][] grid) {
        int ans = Integer.MIN_VALUE, size = grid.length, mark = 2;
        Map<Integer, Integer> getSize = new HashMap<>();
        for (int row = 0; row < size; row++) {
            for (int col = 0; col < size; col++) {
                if (grid[row][col] == 1) {
                    int areaSize = 1 + dfs(grid, row, col, mark);
                    getSize.put(mark++, areaSize);
                }
            }
        }
        for (int row = 0; row < size; row++) {
            for (int col = 0; col < size; col++) {
                //当前位置如果不是 0,那么直接跳过,因为我们只能把 0 变成 1
                if (grid[row][col] != 0) continue;

                Set<Integer> hashSet = new HashSet<>();//防止同一个区域被重复计算
                //计算从当前位置开始获取的 1 的数量,初始化 1 是因为把当前位置的 0 转换成了 1
                int curSize = 1;
                for (int[] current : position) {
                    int curRow = row + current[0], curCol = col + current[1];
                    if (curRow < 0 || curRow >= grid.length || curCol < 0 || curCol >= grid.length) continue;
                    int curMark = grid[curRow][curCol];//获取对应位置的标记
                    //如果标记存在hashSet中,说明该标记被记录过一次,如果不存在 getSize 中说明该标记是无效标记(此时 curMark = 0)
                    if (hashSet.contains(curMark) || !getSize.containsKey(curMark)) continue;
                    hashSet.add(curMark);
                    curSize += getSize.get(curMark);
                }
                ans = Math.max(ans, curSize);
            }
        }
        //当 ans == Integer.MIN_VALUE,说明矩阵数组中不存在 0,全都是有效区域,返回数组大小即可
        return ans == Integer.MIN_VALUE ? size * size : ans;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1607584.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【IDEA】JRebel LS client not configured

主要原因就是因为 jrebel 的版本跟 idea的版本对不上&#xff0c;或者说jrebel的版本比idea的版本还高&#xff0c;导致出现该错误 查看idea版本 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/a7ba43e6822947318cdb0d0e9d8d65e9.png 获取jrebel 版本 如何处理 …

设计模式:简单工厂模式(Simple Factory)

设计模式&#xff1a;简单工厂模式&#xff08;Simple Factory&#xff09; 设计模式&#xff1a;简单工厂模式&#xff08;Simple Factory&#xff09;模式动机模式定义模式结构时序图模式实现测试模式分析实例&#xff1a;Qt 控件类优缺点适用环境模式应用 设计模式&#xff…

李沐-26 网络中的网络 NiN【动手学深度学习v2】

主要记载关于全局平均池化层&#xff08;Global Average Pooling, GAP&#xff09;中如下两点的理解&#xff1a; 1. GAP的原理 2. 相对于全连接层&#xff0c;GAP具有更少的参数 为了直观地说明全局平均池化层相对于全连接层具有更少的参数&#xff0c;我们可以构造一个简…

博客文章:AWS re:Invent 2023 新产品深度解析 - 第四部分

TOC &#x1f308;你好呀&#xff01;我是 是Yu欸 &#x1f30c; 2024每日百字篆刻时光&#xff0c;感谢你的陪伴与支持 ~ &#x1f680; 欢迎一起踏上探险之旅&#xff0c;挖掘无限可能&#xff0c;共同成长&#xff01; 写在最前面 去年发布文章的一部分&#xff0c;由于内…

bugku-web-login2

这里提示是命令执行 抓包发现有五个报文 其中login.php中有base64加密语句 $sql"SELECT username,password FROM admin WHERE username".$username.""; if (!empty($row) && $row[password]md5($password)){ } 这里得到SQL语句的组成&#xff0c;…

SOLIDWORKS批量改名工具个人版 慧德敏学

每个文件都会有自己的名字&#xff0c;SOLIDWOKRKS模型也不例外。但是如果从资源管理器直接修改模型的文件名&#xff0c;就会导致模型关联的丢失&#xff0c;导致装配体打开之后找不到模型&#xff0c;因此就需要使用SOLIDWORKS的重命名功能。 SOLIDWORKS批量改名插件- Solid…

Blazor 下的 Json 编辑器

最近恰好碰到个比较冷门的需求&#xff0c;就是在线编码 Json&#xff0c;这其中有Json的语法着色&#xff0c;有Json对象属性数据类型的限制&#xff0c;其实要是单纯改一下Json字符串也不是难事&#xff0c;就是没法控制让用户只能给属性值&#xff0c;而不是属性名称&#x…

【随笔】Git 高级篇 -- 远程服务器拒绝 git push reset(三十二)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…

C++:仿函数模拟实现STL-priority_queue

优先级队列模拟实现 1.文档了解2.仿函数实现优先级队列仿函数1.定义2.语法3.使用 3.模拟实现源码 1.文档了解 从priority_queue的文档中&#xff0c;我们可以得出以下几点&#xff1a; 1.priority_queue是一个容器适配器 2.priority_queue它实质是一个堆&#xff0c;且默认为大…

【Leetcode】string类刷题

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;Leetcode刷题 目录 1.仅反转字母2.字符串中第一个唯一字符3.验证回文串4.字符串相加5.反转字符串I I6.反转字符串中的单词III7.字符串相乘8.把字符串转换为整数 1.仅反转字母 题目链接&#xff1a;…

MySQL 8.0.19安装教程(windows 64位)

在c盘目录下的Program Files目录下创建MySQL目录&#xff0c;将下载好的mysql解压到里面 解压完是这个样子 配置初始化的my.ini文件的文件 [mysqld] # 设置3306端口 port3306 # 设置mysql的安装目录 basedirC:\Program Files\MySQL # 设置mysql数据库的数据的存放目录 datad…

便携式手提万兆网络协议测试仪

便携式手提万兆网络协议测试仪 平台简介 便携式手提万兆网络协议测试仪&#xff0c;以FPGA万兆卡和X86主板为基础&#xff0c;构建便携式的手提设备。 FPGA万兆卡是以Kintex-7XC7K325T PCIeX4的双路万兆光纤网络卡&#xff0c;支持万兆网络数据的收发和网络协议的定制设计。 …

weblogic JSP action的配置

action(如xxx.do&#xff09;可以在Java文件中通过注解的方式配置&#xff0c;也可以在web.xml中进行配置 在java文件中配置的场合 WebServlet(xxxx.do) 并实现支持的方法&#xff1a;doGet或doPost等 或者 WebServlet(xxxx.do) 并实现service方法 所有method的处理方法都会…

OpenHarmony音频和音乐编码格式—vorbis

简介 一种通用音频和音乐编码格式。 Vorbis编解码器规范属于公共领域。所有技术细节都已发布并记录&#xff0c;任何软件实体都可以充分利用该格式&#xff0c;而无需支付许可费、版税或专利问题。 下载安装 直接在OpenHarmony-SIG仓中搜索vorbis并下载。 使用说明 以OpenHa…

常用UI组件

一、文本组件 1.1 概述 Text为文本组件&#xff0c;用于显示文字内容 1.2 参数 Text组件的参数类型为string | Resource Entry Component struct Index {build() {Column({space : 50}) {Text(你好).fontSize(50)}.width(100%).height(100%).justifyContent(FlexAlign.Cent…

时序深入之CPR(Clock Pessimism Removal)详解

目录 一、CPR概念 二、CPR的计算 三、CPR的开启关闭 四、CPR为0 ​五、参考资料 一、CPR概念 在时序报告的目标时钟路径中&#xff0c;会有一行数据clock pesssimism&#xff0c;第一次见可能都会对这个概念感到疑惑 同样在每条时序路径的summary中&#xff0c;clock pat…

吴恩达机器学习笔记:第 7 周-12支持向量机(Support Vector Machines)12.4-12.6

目录 第 7 周 12、 支持向量机(Support Vector Machines)12.4 核函数 112.5 核函数 212.6 使用支持向量机 第 7 周 12、 支持向量机(Support Vector Machines) 12.4 核函数 1 回顾我们之前讨论过可以使用高级数的多项式模型来解决无法用直线进行分隔的分类 问题&#xff1a; …

CentOS7升级openssl

文章目录 一 系统环境二 操作步骤三 版本检查 一 系统环境 公司服务器等保要求&#xff0c;修复openssl的高危漏洞。 本机使用centos7.9系统&#xff0c;openssl版本是1.0.2k&#xff0c;计划升级到1.1.1q 在执行下列操作前&#xff0c;务必要打快照做好备份&#xff0c;以防升…

java使用fasttext实现文本分类

1.fastText 官网 fastText是一个用于有效学习单词表示和句子分类的库fastText建立在现代Mac OS和Linux发行版上。因为它使用了c 11的特性&#xff0c;所以它需要一个具有良好的c11支持的编译器 2.创建maven项目 maven配置: <?xml version"1.0" encoding&quo…

14 Php学习:表单

表单 PHP 表单是用于收集用户输入的工具&#xff0c;通常用于网站开发。PHP 可以与 HTML 表单一起使用&#xff0c;用于处理用户提交的数据。通过 PHP 表单&#xff0c;您可以创建各种类型的表单&#xff0c;包括文本输入框、复选框、下拉菜单等&#xff0c;以便用户可以填写和…