秋招突击——算法练习——8/26——图论——200-岛屿数量、994-腐烂的橘子、207-课程表、208-实现Trie

文章目录

    • 引言
    • 正文
      • 200-岛屿数量
        • 个人实现
      • 994、腐烂的橘子
        • 个人实现
        • 参考实现
      • 207、课程表
        • 个人实现
        • 参考实现
      • 208、实现Trie前缀树
        • 个人实现
        • 参考实现
    • 总结

引言

正文

200-岛屿数量

题目链接
在这里插入图片描述

个人实现
  • 我靠,这道题居然是腾讯一面的类似题,那道题是计算最大的岛屿面积,如果当时没做出来,现在得哭死!好在做出来了!
  • 这道题单纯使用回溯实现的,然后修改一下地图的坐标就行了!但是修改了原来的地图坐标,这样做效果并不好,但是不这样做,又必须得复制一个原来的数组,这样不行!
class Solution {public int[][] DIRECT = {{0,1},{0,-1},{1,0},{-1,0}};public void dfs(int x,int y,char[][] grid){if(grid[x][y] == '0' || grid[x][y] == '2') return;else grid[x][y] = '2';// 遍历对应的四个方向int m = grid.length;int n = grid[0].length;for(int[] dir:DIRECT){if(x + dir[0] < m && y + dir[1] < n && x + dir[0] >= 0  && y + dir[1] >= 0)dfs(x + dir[0],y + dir[1],grid);}}public int numIslands(char[][] grid) {int count = 0;  for(int i = 0;i < grid.length;i ++){for(int j = 0;j < grid[0].length;j ++){if(grid[i][j] == '1' ) {dfs(i,j,grid);count ++;}}}return count;}
}

在这里插入图片描述

994、腐烂的橘子

  • 题目链接
    在这里插入图片描述
    注意
  • 不会存在空图的情况
个人实现

思路分析

  • 首先不能让所有橘子都变坏,就返回-1,如果不会错,笔试的话,直接返回-1即可。具体见下图,可以看到通过了88个样例。这个技巧在华师大的预推免的笔试中已经见过了,很难受!这个技巧得敏感一点!

在这里插入图片描述

  • 正常思路还是使用BFS进行遍历,知道遍历不了,应为通过BFS的遍历方式和橘子腐烂的方式更像。
class Solution {public int[][] DIRECTION = {{0,1},{0,-1},{1,0},{-1,0}};public int orangesRotting(int[][] grid) {Queue<int[]> q = new ArrayDeque<>();Queue<int[]> q2 = new ArrayDeque<>();int res = 0;// 如果弹出栈的橘子是好橘子,跳过,如果是坏橘子,执行入站for (int i = 0; i < grid.length; i++) {for (int j = 0; j < grid[0].length; j++) {if (grid[i][j] == 2) {// 入栈开始烂橘子int count = 0;q.offer(new int[] { i, j });while (!q.isEmpty()) {int[] curNode = q.poll();int x = curNode[0];int y = curNode[1];for (int[] dir : DIRECTION) {// 遍历四个可以扩展的方向if (x + dir[0] >= 0 && x + dir[0] < grid.length &&y + dir[1] >= 0 && y + dir[1] < grid[0].length) {// 遍历到好橘子,先改变状态,然后直接入站        if (grid[x + dir[0]][y + dir[1]] == 1) {grid[x + dir[0]][y + dir[1]] = 2;q2.offer(new int[] { x + dir[0], y + dir[1] });}}}// 这里需要交换对应的节点if(q.isEmpty() && !q2.isEmpty()){Queue<int[]> temp = q;q = q2;q2 = temp;count ++;}}res = Math.max(res,count ++);}}}for (int i = 0; i < grid.length; i++) for (int j = 0; j < grid[0].length; j++)if(grid[i][j] == 1) return -1; return res;}
}

在这里插入图片描述
总结

  • 这里只能过一半,并不能过所有的样例,因为存在多个烂橘子,然后同时开始腐坏周围的橘子的情况,所以这里就不能抓住一个烂橘子,然后进行遍历,应该是先加上所有的烂橘子,然后所有烂橘子每次都想外扩展一圈,知道没有好橘子了,然后在遍历一下,但是面试的时候可能已经挂了,这里已经没时间了,直接看的样例吧!
参考实现
  • 这里先遍历一次,然后计算一下好橘子和烂橘子的数量,同时将所有的烂橘子加入到一个列表中,然后每一分钟,将所有烂橘子的周围的好橘子都变烂,然后加入到列表中,直到列表为空!
  • 具体实现如下,这里还是自己在原来的代码上修改的!
class Solution {public int[][] DIRECTION = { { 0, 1 }, { 0, -1 }, { 1, 0 }, { -1, 0 } };public int orangesRotting(int[][] grid) {Queue<int[]> q = new ArrayDeque<>();int freshNum = 0;for (int i = 0; i < grid.length; i++) {for (int j = 0; j < grid[0].length; j++) {if (grid[i][j] == 1)freshNum++;if (grid[i][j] == 2)q.offer(new int[] { i, j });}}int orangeNum = q.size() + freshNum;if(orangeNum == 0)  return 0;int count = -1;while (!q.isEmpty()) {count ++;int n = q.size();for (int i = 0; i < n; i++) {int[] curNode = q.poll();int x = curNode[0];int y = curNode[1];for (int[] dir : DIRECTION) {// 遍历四个可以扩展的方向if (x + dir[0] >= 0 && x + dir[0] < grid.length &&y + dir[1] >= 0 && y + dir[1] < grid[0].length) {// 遍历到好橘子,先改变状态,然后直接入站if (grid[x + dir[0]][y + dir[1]] == 1) {grid[x + dir[0]][y + dir[1]] = 2;freshNum --;q.offer(new int[] { x + dir[0], y + dir[1] });}}}}}if(freshNum != 0) return -1;return count;}
}

在这里插入图片描述

207、课程表

  • 题目链接
    在这里插入图片描述
个人实现

思路分析

  • 前缀课程这个想到了并查集,但是这个是检测是否成环的,这个有点忘记了,成环我记得有一个特定的算法,想想看!
  • 使用并查集,然后进行判定,父节点是否是自己!

在这里插入图片描述

上述两种情况并不好进行鉴别,这里应该修改一下,如果是初始状态,就默认是-1,然后如果是其他节点,就不是-1,看看行不行!

class Solution {int[] f;boolean flag = false;public int find(int idx){if(f[idx] == idx ){flag = true;return idx;}if(f[idx] == -1){return idx;}else{return find(f[idx]);}}public void union(int a,int b){// a节点是子节点,b节点是父节点// 找到对应的父亲节点int fa = find(a);int fb = find(b);if(fa == fb)    {flag = true;}// 设置对应的父亲节点f[fb] = fa;}public boolean canFinish(int numCourses, int[][] prerequisites) {// 创建并初始化父节点的数组f = new int[numCourses];for(int i = 0;i < numCourses;i ++) f[i] = -1;// 绑定父亲节点之间的关系for(int[] pre:prerequisites)    union(pre[0],pre[1]);// 这里要判定一下,是否没一门课都有自己的前导课程if(flag)    return false;return true;}
}

在这里插入图片描述
在这里插入图片描述

  • 确实没有环,但是插入3的关系时,还是出了问题,如果按照我这样写,3的先导课程已经插入过了,下次插入,会找到的祖先相同,直接返回false

又修改了一下,这里仅仅区分原始的单个节点成环状态,如果某个节点匹配到自己,就是实际上成环,直接退出

具体如下

class Solution {int[] f;public int find(int idx){if(f[idx] == -1 || f[idx] == idx){return idx;}else{return find(f[idx]);}}public void union(int a,int b){// a节点是子节点,b节点是父节点// 找到对应的父亲节点int fa = find(a);int fb = find(b);// 设置对应的父亲节点f[fb] = fa;}public boolean canFinish(int numCourses, int[][] prerequisites) {// 创建并初始化父节点的数组f = new int[numCourses];for(int i = 0;i < numCourses;i ++) f[i] = -1;// 绑定父亲节点之间的关系for(int[] pre:prerequisites)    union(pre[0],pre[1]);// 这里要判定一下,是否没一门课都有自己的前导课程for(int i = 0 ;i < numCourses;i ++) if(f[i] == i)   return false;return true;}
}

在这里插入图片描述
在这里插入图片描述
上述算法不行的,因为会出现一个问题,就是一个节点会有多个父节点,但是使用并查集,只能保存一个父节点,所以还是只能想到DFS或者BFS,但是不想这样做,没有任何意义!

参考实现

无向图成环——染色原理-三色

有向图求拓扑排序的问题——这是一个模版题

  • 遍历所有入度为零的点,对应子节点入度减一,入度为零加入队列,不能遍历完所有节点,就是有环

下图是针对成环的度数操作
在这里插入图片描述
下图是针对不成环的操作
在这里插入图片描述

class Solution {public boolean canFinish(int n, int[][] prerequisites) {// 创建邻接表,并进行赋值List<List<Integer>> grid = new ArrayList<>();int[] inNum = new int[n + 1];for(int i = 0;i <= n;i ++)  grid.add(new ArrayList<>());for(int[] edge: prerequisites){grid.get(edge[0]).add(edge[1]);inNum[edge[1]] ++;}// 遍历所有的节点,找到所有入度为零的点,加入队列进行遍历Queue<Integer> q = new ArrayDeque<>();for(int i = 0;i < n;i ++) if(inNum[i] == 0)q.offer(i);// 然后遍历队列中的点,并将其子节点的入度减一int visitedNum = q.size();while(!q.isEmpty()){int curNode = q.poll();// 遍历当前节点的所有后继子节点,并进行访问for(int i :grid.get(curNode)){inNum[i] --;if(inNum[i] == 0)   {q.offer(i);visitedNum ++;}}} if(visitedNum == n) return true;return false;}
}

在这里插入图片描述
总结

  • 这类图论的题目,这些基础的定理想起来了,就是会做,没想起来,只能硬做,没什么办法,具体需要考虑的因素也就只有出度、入度,然后成环也就是不同的情况而已!

208、实现Trie前缀树

  • 题目链接
    在这里插入图片描述
    注意
  • 这个会不会有多个字符串插入?会的
  • startwith是判定是否为前缀
  • search是找是否存在对应的字符串
个人实现

思路分析

  • 如果只有一个search,使用一个map就能够简单实现,找得到就是true,找不到就是false。或者说使用一个set也是完全可以的。
  • 现在如果只有一个startwith,就需要建造一个类似霍夫曼匹配树的东西,具体见下图。
    • 但是这个链表,太费空间了,想想每一个节点都要有对应的指针的往下才行,不过先实现一下,能通过就行!

在这里插入图片描述

个人实现

class Trie {class Node{char v;Map<Character,Node> map;Node(char c){v = c;map = new HashMap<>();}void put(Node next){map.put(next.v,next);}}Set<String> set;Map<Character,Node> sourMap;public Trie() {sourMap = new HashMap<>();set = new HashSet<>();}public void insert(String word) {set.add(word);// 先找到第一个字母对应的链表的位置char curChar = word.charAt(0);Node curNode;if(sourMap.containsKey(curChar)){// 包含当前节点curNode = sourMap.get(curChar);}else{// 不包含当前节点curNode  = new Node(curChar);sourMap.put(curChar,curNode);}// 构造对应的链表节点 for(int i = 1;i < word.length();i ++){char nextChar = word.charAt(i);// 判断当前的curNode是否包含了对应的节点的Node nextNode = null;if(!curNode.map.containsKey(nextChar)){nextNode = new Node(nextChar);curNode.put(nextNode);}else{nextNode = curNode.map.get(nextChar);}curNode = nextNode;}}public boolean search(String word) {return set.contains(word);}public boolean startsWith(String prefix) {char curChar = prefix.charAt(0);if(!sourMap.containsKey(curChar))   return false;Node curNode = sourMap.get(curChar);for(int i = 1;i < prefix.length();i ++){char nextChar = prefix.charAt(i);// 判断当前的curNode是否包含了对应的节点的if(!curNode.map.containsKey(nextChar)){return false;}curNode = curNode.map.get(nextChar);}return true;}
}

总结

  • 靠,我都惊讶了,一次过了,逻辑没啥问题!难得!
  • 总觉得我实现的不够光彩,还是有很多的问题,空间复杂度太高了,真的爆炸!
参考实现
  • 基本的思路还是一样的,不过增加了一个叶子节点的boolean状态值,判定是否存在对应的以叶子节点为结尾的序列是否存在。
  • 这里是使用数组来保存对应的后继节点的,然后默认是26个小写字母,所以会使用对应的字符串序列进行表示!
class Trie {class Node{boolean isExist;Node[] son;Node(){isExist = false;son = new Node[26];}}Node root;public Trie() {root = new Node();}public void insert(String word) {Node curNode = root;for(char x:word.toCharArray()){int idx = x - 'a';if(curNode.son[idx] == null){curNode.son[idx] = new Node();}curNode = curNode.son[idx];}curNode.isExist = true;}public boolean search(String word) {Node curNode = root;for(char x:word.toCharArray()){int idx = x - 'a';if(curNode.son[idx] == null){return false;}curNode = curNode.son[idx];}return curNode.isExist;}public boolean startsWith(String prefix) {Node curNode = root;for(char x:prefix.toCharArray()){int idx = x - 'a';if(curNode.son[idx] == null)    return false;curNode = curNode.son[idx];}return true;}
}

在这里插入图片描述
总结

  • 这个代码效率确实更高,写起来更加简洁!

总结

  • hot100的图论基本上都过了,总体来说还是其他部分要简单,继续二刷其他题目!保证每道题都能刷个两三遍!这样笔试还有手撕就不害怕了!

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

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

相关文章

[数据集][目标检测]智慧牧场猪只检测数据集VOC+YOLO格式16245张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;16245 标注数量(xml文件个数)&#xff1a;16245 标注数量(txt文件个数)&#xff1a;16245 标…

vue使用html2Canvas导出图片 input文字向上偏移

vue使用html2Canvas导出图片 input文字向上偏移 图中 用的是element的输入框 行高 32px,经常测试 你使用原生的input 还是会出现偏移。 解决方法&#xff1a;修改css样式 1.怎么实现导出 网上随便找很多 2.在第一步 获取你要导出的元素id 克隆后 修改他的样式或者 你直接在你需…

基于单片机的水箱水质监测系统设计

本设计基于STM32F103C8T6为核心控制器设计了水质监测系统&#xff0c;选用DS18B20温度传感器对水箱水体温度进行采集&#xff1b;E-201-C PH传感器获取水体PH值&#xff1b;选用TS-300B浊度传感器检测水体浊度&#xff1b;采用YW01液位传感器获取水位&#xff0c;当检测水位低于…

宽带和带宽分不清楚

如何理解带宽 我们平时经常听到的带宽其实是宽带&#xff0c;举个栗子&#xff1a;我家用的是xx运营商提供的&#xff0c;号称1000M宽带&#xff0c;这其实指是的网络数据传输的速率是&#xff1a;1000Mbs&#xff08;即125MBps&#xff09;。 那么既然有宽带&#xff0c;就有…

MCU官方IDE软件安装及学习教程集合 — STM32CubeIDE(STM32)

简介 各MCU厂商为保证产品的市场地位以及用户体验&#xff0c;不断的完善自己的产品配套&#xff0c;搭建自己的开发生态&#xff0c;像国外ST公司&#xff0c;国内的GD&#xff08;兆易创新&#xff09;&#xff0c;AT&#xff08;雅特力&#xff09;等等。目前就开发生态而言…

09.定时器02

#include "reg52.h"sbit led P3^6;void delay10ms() { //1. 配置定时器0工作模式位16位计时TMOD 0x01;//2. 给初值&#xff0c;定一个10ms出来TL00x00;TH00xDC;//3. 开始计时TR0 1;TF0 0; } void main() {int cnt 0;led 1;while(1){if(TF0 1)//当爆表的时候&a…

【Qt】QLCDNumber | QProgressBar | QCalendarWidget

文章目录 QLCDNumber —— 显示数字QLCDNumber 的属性QLCDNumber 的使用 QProgressBar —— 进度条QProgressBar 的属性创建一个进度条修改为 红色的进度条 QCalendarWidget —— 日历QCalendarWidget 的属性QCalendarWidget 的使用 QLCDNumber —— 显示数字 QLCDNumber 的属…

UE4_后期处理_后期处理材质及后期处理体积一

后期处理效果 在渲染之前应用于整个渲染场景的效果。 后期处理效果&#xff08;Post-processing effect&#xff09;使美术师和设计师能够对影响颜色、色调映射、光照的属性和功能进行组合选择&#xff0c;从而定义场景的整体外观。要访问这些功能&#xff0c;可以将一种称为…

多角度解读WMS:探寻仓库管理系统的核心功能

多角度解读 WMS 仓库管理系统 1. 概述 WMS 在数字化工厂中具有举足轻重的地位&#xff0c;它不仅提高了仓储管理的效率与准确性&#xff0c;还能优化整个供应链的管理&#xff0c;支持灵活生产模式&#xff0c;并提供决策支持的关键数据。通过现代前后端技术的架构设计&#xf…

【Spring Boot 3】自定义拦截器

【Spring Boot 3】自定义拦截器 背景介绍开发环境开发步骤及源码工程目录结构总结背景 软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历中,每次学习新技术总是要花费或多或…

Prometheus_0基础_学习笔记

一、基本概念 Prometheus是由golang语言开发的一套开源的监控、报警、时间序列数据库的组合&#xff0c;是一款基于时序数据库的开源监控告警系统。 时间序列数据库&#xff1a;时间序列数据库&#xff08;Time Serires Database , TSDB&#xff09;不同于传统的关系型数据库。…

idea如何高亮、标记代码颜色的2种方式

zihao 第一种高亮方式 ctrlf 双击选择执行快捷键&#xff0c;所有被搜索的单词都会被搜索且高亮 第二种高亮方式 安装grep console 日志管理插件 ctrlaltf3 双击选择执行快捷键&#xff0c;所有被标记一个颜色高亮

银行卡二三四要素验证-银行卡二三四要素验证接口-银行卡二三四要素验证api

1、接口介绍 银行卡二三四要素验证接口是一种用于验证用户银行卡信息真实性和有效性的技术接口。这种接口在金融、电商等领域有着广泛的应用&#xff0c;旨在确保交易的安全性和合规性。 2、接口地址 全面覆盖&#xff0c;支持所有带银联标识的银行卡; 高准确性-验证结果实时返…

科技型中小企业怎么做

在当今快速发展的科技时代&#xff0c;科技型中小企业扮演着越来越重要的角色。这些企业不仅推动了技术创新&#xff0c;还为经济增长和社会进步做出了巨大贡献。那么&#xff0c;科技型中小企业应如何制定并执行其发展战略呢&#xff1f; 1. 明确定位与战略规划 对于任何企业…

云服务器+docker:还在为项目上线苦恼?一文包你解决(保姆级教程,图文并茂,万字起步!!!)

目录 Blue留言机&#xff1a; 学习视频以及参考资料 &#xff1a; 1、学习之前的必备操作&#xff1a; 第一步&#xff1a;购买服务器 选择一台免费的云服务器&#xff08;包白嫖的&#xff09; 配置服务器的一点说明&#xff1a; 查看自己是否购买成功&#xff1a; 第…

docker制作达梦数据库驱动的Python镜像记录

docker制作达梦数据库驱动的Python镜像记录 使用Sqlalchemy ORM 操作达梦 提供构建好的docker镜像 docker pull chongjing001/python:3.12 使用虚拟环境(source /venv/bin/activate) 后pip其他库 镜像中安装Python参考上一篇 下载DM8安装包 版本选择 官网 Linux安装包只有 r…

Python基础笔记

一、python基础1.1 基础知识1.1.1 注释 注释&#xff1a;在程序中对程序代码进行解释说明的文字。 作用&#xff1a;注释不是程序&#xff0c;不能被执行&#xff0c;只是对程序代码进行解释说明&#xff0c;让别人可以看懂程序代码的作用&#xff0c;能够大大增强程序的可读性…

基于yolov8的红绿灯目标检测训练与Streamlit部署(代码+教程)

项目背景 随着智能交通系统的快速发展&#xff0c;自动驾驶技术逐渐成为研究的热点。在自动驾驶领域中&#xff0c;准确识别道路上的交通信号灯是确保车辆安全行驶的关键技术之一。近年来&#xff0c;深度学习技术的发展为交通信号灯的识别提供了强大的支持。YOLO&#xff08;…

集成电路学习:什么是I/O输入输出

I/O&#xff1a;输入输出 I/O&#xff0c;全称Input/Output&#xff0c;即输入输出&#xff0c;是信息处理系统&#xff08;如计算机&#xff09;与外部世界&#xff08;可能是人类或另一信息处理系统&#xff09;之间的通信方式。具体来说&#xff0c;输入是系统接收的信号或数…

【Java那些事】关于Git的使用

目录 下拉代码仓库篇 上传代码篇 下拉代码仓库篇 第一步&#xff0c;下拉代码&#xff0c;复制链接。 &#xff08;从开源网站上复制链接&#xff09; &#xff08;建立本地仓库&#xff09; 这里的URL一般都会自动填充刚刚复制的链接【瞅瞅&#xff0c;确保是想要的那个项…