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

2024-04-14 17:36

本文主要是介绍代码随想录-算法训练营day12【休息,复习与总结】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

代码随想录-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];//从太平洋边界开始DFSfor (int i = 0; i < m; i++) {//遍历第一行,从第一行开始dfs(matrix, canReachPacific, i, 0);}for (int j = 1; j < n; j++) {//遍历第一列,然后从第一列的第二个元素开始dfs(matrix, canReachPacific, 0, j);}//从大西洋边界开始DFSfor (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 变成 1if (grid[row][col] != 0) continue;Set<Integer> hashSet = new HashSet<>();//防止同一个区域被重复计算//计算从当前位置开始获取的 1 的数量,初始化 1 是因为把当前位置的 0 转换成了 1int 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;}
}

这篇关于代码随想录-算法训练营day12【休息,复习与总结】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/903584

相关文章

关于C++中的虚拟继承的一些总结(虚拟继承,覆盖,派生,隐藏)

1.为什么要引入虚拟继承 虚拟继承是多重继承中特有的概念。虚拟基类是为解决多重继承而出现的。如:类D继承自类B1、B2,而类B1、B2都继承自类A,因此在类D中两次出现类A中的变量和函数。为了节省内存空间,可以将B1、B2对A的继承定义为虚拟继承,而A就成了虚拟基类。实现的代码如下: class A class B1:public virtual A; class B2:pu

可视化实训复习篇章

前言: 今天,我们来学习seaborn库可视化,当然,这个建立在Matplotlib的基础上,话不多说,进入今天的正题吧!当然,这个是《python数据分析与应用》书中,大家有需求的可以参考这本书。 知识点: Matplotlib中有两套接口分别是pyplot和pyylab,即绘图时候主要导入的是Matplotlib库下的两个子模块(两个py文件)matplotlib.pyplot和matp

随想录 Day 69 并查集 107. 寻找存在的路径

随想录 Day 69 并查集 107. 寻找存在的路径 理论基础 int n = 1005; // n根据题目中节点数量而定,一般比节点数量大一点就好vector<int> father = vector<int> (n, 0); // C++里的一种数组结构// 并查集初始化void init() {for (int i = 0; i < n; ++i) {father[i] = i;}

uniapp接入微信小程序原生代码配置方案(优化版)

uniapp项目需要把微信小程序原生语法的功能代码嵌套过来,无需把原生代码转换为uniapp,可以配置拷贝的方式集成过来 1、拷贝代码包到src目录 2、vue.config.js中配置原生代码包直接拷贝到编译目录中 3、pages.json中配置分包目录,原生入口组件的路径 4、manifest.json中配置分包,使用原生组件 5、需要把原生代码包里的页面修改成组件的方

公共筛选组件(二次封装antd)支持代码提示

如果项目是基于antd组件库为基础搭建,可使用此公共筛选组件 使用到的库 npm i antdnpm i lodash-esnpm i @types/lodash-es -D /components/CommonSearch index.tsx import React from 'react';import { Button, Card, Form } from 'antd'

17.用300行代码手写初体验Spring V1.0版本

1.1.课程目标 1、了解看源码最有效的方式,先猜测后验证,不要一开始就去调试代码。 2、浓缩就是精华,用 300行最简洁的代码 提炼Spring的基本设计思想。 3、掌握Spring框架的基本脉络。 1.2.内容定位 1、 具有1年以上的SpringMVC使用经验。 2、 希望深入了解Spring源码的人群,对 Spring有一个整体的宏观感受。 3、 全程手写实现SpringM

十五.各设计模式总结与对比

1.各设计模式总结与对比 1.1.课程目标 1、 简要分析GoF 23种设计模式和设计原则,做整体认知。 2、 剖析Spirng的编程思想,启发思维,为之后深入学习Spring做铺垫。 3、 了解各设计模式之间的关联,解决设计模式混淆的问题。 1.2.内容定位 1、 掌握设计模式的"道" ,而不只是"术" 2、 道可道非常道,滴水石穿非一日之功,做好长期修炼的准备。 3、 不要为了

数据库期末复习知识点

A卷 1. 选择题(30') 2. 判断范式(10') 判断到第三范式 3. 程序填空(20') 4. 分析填空(15') 5. 写SQL(25') 5'一题 恶性 B卷 1. 单选(30') 2. 填空 (20') 3. 程序填空(20') 4. 写SQL(30') 知识点 第一章 数据库管理系统(DBMS)  主要功能 数据定义功能 (DDL, 数据定义语

代码随想录算法训练营:12/60

非科班学习算法day12 | LeetCode150:逆波兰表达式 ,Leetcode239: 滑动窗口最大值  目录 介绍 一、基础概念补充: 1.c++字符串转为数字 1. std::stoi, std::stol, std::stoll, std::stoul, std::stoull(最常用) 2. std::stringstream 3. std::atoi, std

记录AS混淆代码模板

开启混淆得先在build.gradle文件中把 minifyEnabled false改成true,以及shrinkResources true//去除无用的resource文件 这些是写在proguard-rules.pro文件内的 指定代码的压缩级别 -optimizationpasses 5 包明不混合大小写 -dontusemixedcaseclassnames 不去忽略非公共