力扣每日一题130:被围绕的区域

题目

中等

相关标签

相关企业

给你一个 m x n 的矩阵 board ,由若干字符 'X' 和 'O' ,找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O' 用 'X' 填充。

示例 1:

输入:board = [["X","X","X","X"],["X","O","O","X"],["X","X","O","X"],["X","O","X","X"]]
输出:[["X","X","X","X"],["X","X","X","X"],["X","X","X","X"],["X","O","X","X"]]
解释:被围绕的区间不会存在于边界上,换句话说,任何边界上的 'O' 都不会被填充为 'X'。 任何不在边界上,或不与边界上的 'O' 相连的 'O' 最终都会被填充为 'X'。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。

示例 2:

输入:board = [["X"]]
输出:[["X"]]

提示:

  • m == board.length
  • n == board[i].length
  • 1 <= m, n <= 200
  • board[i][j] 为 'X' 或 'O'

通过次数 285.7K

提交次数 614.4K

通过率 46.5%

方法一:并查集

利用并查集,将相邻的相同字母视为一个连通集。边界上的'O'视为同一个集,易得,不与边界上的'O'相邻的'O'即为被围绕的区域。

下面是某位大佬的java代码

class UnionFind {int[] parents;public UnionFind(int totalNodes) {parents = new int[totalNodes];for (int i = 0; i < totalNodes; i++) {parents[i] = i;}}// 合并连通区域是通过find来操作的, 即看这两个节点是不是在一个连通区域内.void union(int node1, int node2) {int root1 = find(node1);int root2 = find(node2);if (root1 != root2) {parents[root2] = root1;}}int find(int node) {while (parents[node] != node) {// 当前节点的父节点 指向父节点的父节点.// 保证一个连通区域最终的parents只有一个.parents[node] = parents[parents[node]];node = parents[node];}return node;}boolean isConnected(int node1, int node2) {return find(node1) == find(node2);}
}
class Solution {int rows;int cols;public void solve(char[][] board) {if (board == null || board.length == 0)return;rows = board.length;cols = board[0].length;// 用一个虚拟节点, 边界上的O 的父节点都是这个虚拟节点UnionFind uf = new UnionFind(rows * cols + 1);int dummyNode = rows * cols;for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {if (board[i][j] == 'O') {// 遇到O进行并查集操作合并if (i == 0 || i == rows - 1 || j == 0 || j == cols - 1) {// 边界上的O,把它和dummyNode 合并成一个连通区域.uf.union(node(i, j), dummyNode);} else {// 和上下左右合并成一个连通区域.if (i > 0 && board[i - 1][j] == 'O')uf.union(node(i, j), node(i - 1, j));if (i < rows - 1 && board[i + 1][j] == 'O')uf.union(node(i, j), node(i + 1, j));if (j > 0 && board[i][j - 1] == 'O')uf.union(node(i, j), node(i, j - 1));if (j < cols - 1 && board[i][j + 1] == 'O')uf.union(node(i, j), node(i, j + 1));}}}}for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {if (uf.isConnected(node(i, j), dummyNode)) {// 和dummyNode 在一个连通区域的,那么就是O;board[i][j] = 'O';} else {board[i][j] = 'X';}}}}int node(int i, int j) {return i * cols + j;}}

方法二:深度优先搜索

前面提到,不与边界的'O'连通的'O'即为被包围的区域。所以我们可以以四条边上的'O'为起点搜索,将与边界'O'连通的'O'做个标记,随后有标记的'O'就改回'O',没有标记的'O'就变成'X'。

class Solution {
public:void dfs(vector<vector<char>>& board,int x,int y,int n,int m){if(x<0||x>=n||y<0||y>=m||board[x][y]!='O'){return;}board[x][y]='Y';dfs(board,x+1,y,n,m);dfs(board,x,y-1,n,m);dfs(board,x-1,y,n,m);dfs(board,x,y+1,n,m);}void solve(vector<vector<char>>& board) {int n=board.size();if(n==1) return;int m=board[0].size();if(m==1) return;for(int i=0;i<n;i++){dfs(board,i,0,n,m);dfs(board,i,m-1,n,m);}for(int j=1;j<m-1;j++){dfs(board,0,j,n,m);dfs(board,n-1,j,n,m);}for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(board[i][j]=='Y')board[i][j]='O';else if(board[i][j]=='O')board[i][j]='X';}}}
};

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

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

相关文章

U盘文件系统结构损坏的应对与预防

在数字化时代&#xff0c;U盘作为便携式存储设备&#xff0c;其重要性不言而喻。然而&#xff0c;当U盘文件系统结构损坏时&#xff0c;我们可能会面临数据丢失的风险。本文将深入探讨U盘文件系统结构损坏的问题&#xff0c;分析其产生的原因&#xff0c;并给出相应的数据恢复方…

基于pytoch卷积神经网络水质图像分类实战

具体怎么学习pytorch&#xff0c;看b站刘二大人的视频。 完整代码&#xff1a; import numpy as np import os from PIL import Image import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data…

时序数据库是Niche Market吗?

引言 DB-Engines的流行程度排行从其评估标准[4]可以看出完全不能够做为市场规模的评估标准。甚至于在知道市场规模后可以用这个排行作为一个避雷手册。毕竟现存市场小&#xff0c;可预见增长规模小&#xff0c;竞争大&#xff0c;创新不足&#xff0c;那只能卷价格&#xff0c…

【文献阅读】LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS

目录 1. motivation2. overall3. model3.1 low rank parametrized update matrices3.2 applying lora to transformer 4. limitation5. experiment6. 代码7. 补充参考文献 1. motivation 常规的adaptation需要的微调成本过大现有方法的不足&#xff1a; Adapter Layers Introd…

.net core 使用js,.net core 使用javascript,在.net core项目中怎么使用javascript

.net core 使用js&#xff0c;.net core 使用javascript&#xff0c;在.net core项目中怎么使用javascript 我项目里需要用到“文字编码”&#xff0c;为了保证前端和后端的编码解码不处bug, 所以&#xff0c;我在项目中用了这个 下面推荐之前在.net F4.0时的方法 文章一&#…

操作系统真象还原:中断

第7章-中断 这是一个网站有所有小节的代码实现&#xff0c;同时也包含了Bochs等文件 7.2操作系统是中断驱动的 没有中断&#xff0c;操作系统几乎什么都做不了&#xff0c;操作系统是中断驱动。 7.3中断分类 7.3.1外部中断 外部中断是指来自 CPU 外部的中断&#xff0c;而…

Python基础教程(八):迭代器与生成器编程

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; &#x1f49d;&#x1f49…

时隔很久运行苍穹外卖项目,出现很多错误

中途运行了很多其他项目&#xff0c;maven的配置文件还被我修改了一次。导致再次运行苍穹外卖项目出现很多错误。 发现没有办法&#xff0c;把本地的仓库删了个干干净净。然后点击clean发现报错&#xff1a; Cannot access alimaven (http://mavejavascript:void(0);n.aliyun.…

力扣每日一题 6/10

881.救生艇[中等] 题目&#xff1a; 给定数组 people 。people[i]表示第 i 个人的体重 &#xff0c;船的数量不限&#xff0c;每艘船可以承载的最大重量为 limit。 每艘船最多可同时载两人&#xff0c;但条件是这些人的重量之和最多为 limit。 返回 承载所有人所需的最小船…

Vue15-watch对比计算属性

一、姓名案例 1-1、watch实现 1-2、计算属性 对比发现&#xff1a; 计算属性比watch属性更简略一些。 1-3、计算属性 VS 侦听属性 1-4、需求变更 计算属性中不能开启异步任务&#xff01;&#xff01;&#xff01;因为计算属性靠return返回值。但是watch靠亲自写代码去改。 1-…

streamlit:如何快速构建一个应用,不会前端也能写出好看的界面

通过本文你可以了解到&#xff1a; 如何安装streamlit&#xff0c;运行起来第一个demo熟悉streamlit的基本语法&#xff0c;常用的一些组件使用streamlit库构建应用 大模型学习参考&#xff1a; 大模型学习资料整理&#xff1a;如何从0到1学习大模型&#xff0c;搭建个人或企业…

设计模式之观察者模式ObserverPattern(十一)

一、概述 观察者模式 (Observer Pattern) 是一种行为型设计模式&#xff0c;又被称为发布-订阅 (Publish/Subscribe) 模式&#xff0c;它定义了对象之间的一种一对多的依赖关系&#xff0c;使得当一个对象的状态发生变化时&#xff0c;所有依赖于它的对象都会自动收到通知并更新…

Duck Bro的第512天创作纪念日

Tips&#xff1a;发布的文章将会展示至 里程碑专区 &#xff0c;也可以在 专区 内查看其他创作者的纪念日文章 我的创作纪念日第512天 文章目录 我的创作纪念日第512天一、与CSDN平台的相遇1. 为什么在CSDN这个平台进行创作&#xff1f;2. 创作这些文章是为了赚钱吗&#xff1f…

手写kNN算法的实现-用欧几里德空间来度量距离

kNN的算法思路&#xff1a;找K个离预测点最近的点&#xff0c;然后让它们进行投票决定预测点的类型。 step 1: kNN存储样本点的特征数据和标签数据step 2: 计算预测点到所有样本点的距离&#xff0c;关于这个距离&#xff0c;我们用欧几里德距离来度量&#xff08;其实还有很多…

ui自动化中,selenium进行元素定位,以及CSS,xpath定位总结

几种定位方式 简单代码 from selenium import webdriver import time# 创建浏览器驱动对象 from selenium.webdriver.common.by import Bydriver webdriver.Chrome() # 参数写浏览器驱动文件的路径&#xff0c;若配置到环境变量就不用写了 # 访问网址 driver.get…

WPF-UI布局

WPF布局元素有如下几个&#xff1a; Grid&#xff1a;网格。可以自定义行和列并通过行列的数量、行高和列宽来调整控件的布局。StackPanel&#xff1a;栈式面板。可将包含的元素在竖直或水平方向上排成一条直线&#xff0c;当移除一个元素后&#xff0c;后面的元素会自动向前移…

两台电脑通过网线直连共享数据(超详细)- 我的实践记录

原文链接 按照原文的操作&#xff0c;成功通过直连网线连接了两台windows电脑并共享传输数据。 ping不通可能是防火墙没关闭导致的&#xff0c;但是完全关闭防火墙又不安全。 那么有没有不关闭防火墙&#xff0c;能够上网&#xff0c;又能直连另一台电脑呢&#xff1f; 我们…

Linux启动KKfileview文件在线浏览时报错:启动office组件失败,请检查office组件是否可用

目录 1、导论 2、报错信息 3、问题分析 4、解决方法 4.1、下载 4.2、安装步骤 1、导论 今天进行项目部署时&#xff0c;遇到了一个问题。在启动kkfileview时&#xff0c;出现了报错异常&#xff1a; 2024-06-09 06:36:44.765 ERROR 1 --- [ main] cn.keking.service.Of…

全球溃败,苹果可能要全球大降价了,试图摆脱中国制造的后果

苹果一季度在中国市场的出货量暴跌&#xff0c;导致它不得不在中国市场大降价&#xff0c;从3月份就在中国市场大幅度降价&#xff0c;然而目前它在美国和欧洲两大市场也出现大幅衰退&#xff0c;降价可能将成为苹果在全球的举措。 市调机构Canalys公布的一季度数据显示&#x…

Warning: `ReactDOMTestUtils.act` is deprecated in favor of `React.act`.

问题&#xff1a;在代码中使用jest进行单元测试时&#xff0c;报错如下&#xff1a; 解决思路&#xff1a; 根据报错提示出来的 react-dom/test-utils 进行全局搜索&#xff0c;发现没有该引用&#xff0c;故进入该代码块中分析。发现代码中引入testing-library/react &#…