Leetcode 1020 飞地的数量
地址 https://leetcode-cn.com/problems/number-of-enclaves/
给出一个二维数组 A,每个单元格为 0(代表海)或 1(代表陆地)。
移动是指在陆地上从一个地方走到另一个地方(朝四个方向之一)或离开网格的边界。
返回网格中无法在任意次数的移动中离开网格边界的陆地单元格的数量。
示例 : 输入:[[,,,],[,,,],[,,,],[,,,]]
输出:
解释:
有三个 被 包围。一个 没有被包围,因为它在边界上。
示例 : 输入:[[,,,],[,,,],[,,,],[,,,]]
输出:
解释:
所有 都在边界上或可以到达边界。
提示: <= A.length <=
<= A[i].length <=
<= A[i][j] <=
所有行的大小都相同
这题目和之前的
POJ 2386 Lake Counting
poj 1979 Red and Black
基本一致 可以使用并查集和DFS完成
这里就换个思路 给个BFS版本 不过提交 就tle了 仅仅是提供个答案外的思路
class Solution {
public:
int numEnclaves(vector<vector<int>>& A) {
if (A.empty()) return ;
int n = A.size();
int m = A[].size();
int ret = ;
for (int i = ; i < n; i++) {
for (int j = ; j < m; j++) {
if (i == || i == ( n - ) || j == || j == (m - )) {
if(A[i][j] ==)
bfs(A, i, j);
}
}
}
for (int i = ; i < n; i++) {
for (int j = ; j < m; j++) {
if (A[i][j] == ) {
ret++;
}
}
}
return ret;
}
private:
int bfs(vector<vector<int>>& A, int i, int j) {
int cnt = ;
queue<vector<int>> que;
que.push({ i, j });
int di[] = { , , , - };
int dj[] = { , -, , };
while (!que.empty()) {
vector<int> cur(que.front());
que.pop();
cnt++;
A[cur[]][cur[]] = ;
for (int k = ; k < ; k++) {
int ni = cur[] + di[k];
int nj = cur[] + dj[k];
if (valid(ni, nj, A.size(), A[].size()) && A[ni][nj] == ) {
que.push({ ni, nj });
}
}
}
return cnt;
}
bool valid(int i, int j, int n, int m) {
return (i >= && i < n && j >= && j < m);
}
};
ac code:
class Solution {
public:
int addx[]; int addy[];
void Dfs(vector<vector<int>>& A,int x ,int y)
{
if( x < || x>= A.size() || y < || y >= A[].size()) return;
A[x][y] = ;
for(int i = ;i <;i++){
int newx = x + addx[i];
int newy = y + addy[i];
if(newx>= && newx < A.size() && newy >= && newy< A[].size() && A[newx][newy] == )
Dfs(A,newx,newy);
}
}
int numEnclaves(vector<vector<int>>& A) {
if(A.empty() || A[].empty()) return ;
addx[] = -;addx[] = ; addx[] = ;addx[] = ;
addy[] = ;addy[] = ; addy[] = -;addy[] = ;
for(int i = ;i<A.size();++i){
for(int j = ; j< A[].size();++j){
if(i == || i == A.size()- || j == || j == A[].size()- ){
if(A[i][j] == ){
//边缘的元素 并且== 1
Dfs(A,i,j);
}
}
}
}
int count = ;
for(int i = ;i<A.size();++i){
for(int j = ; j< A[].size();++j){
if(A[i][j] == ) count++;
}
}
return count;
}
};

Leetcode 1020 飞地的数量的更多相关文章
- Leetcode之深度优先搜索(DFS)专题-1020. 飞地的数量(Number of Enclaves)
Leetcode之深度优先搜索(DFS)专题-1020. 飞地的数量(Number of Enclaves) 深度优先搜索的解题详细介绍,点击 给出一个二维数组 A,每个单元格为 0(代表海)或 1( ...
- Leetcode 200.岛屿的数量 - DFS、BFS
Leetcode 200 岛屿的数量: DFS利用函数调用栈保证了检索顺序, BFS则需要自己建立队列,把待检索对象按规则入队. class Solution { // DFS解法,8ms/10.7M ...
- [Swift]LeetCode1020. 飞地的数量 | Number of Enclaves
Given a 2D array A, each cell is 0 (representing sea) or 1 (representing land) A move consists of wa ...
- LeetCode 200:岛屿数量 Number of Islands
题目: 给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量.一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的.你可以假设网格的四个边均被水包围. Given ...
- Leetcode 1020. 将数组分成和相等的三个部分
1020. 将数组分成和相等的三个部分 显示英文描述 我的提交返回竞赛 用户通过次数321 用户尝试次数401 通过次数324 提交次数883 题目难度Easy 给定一个整数数组 A,只有我们可 ...
- Leetcode 452.用最少数量的箭引爆气球
用最少数量的箭引爆气球 在二维空间中有许多球形的气球.对于每个气球,提供的输入是水平方向上,气球直径的开始和结束坐标.由于它是水平的,所以y坐标并不重要,因此只要知道开始和结束的x坐标就足够了.开始坐 ...
- Leetcode 447.回旋镖的数量
回旋镖的数量 给定平面上 n 对不同的点,"回旋镖" 是由点表示的元组 (i, j, k) ,其中 i 和 j 之间的距离和 i 和 k 之间的距离相等(需要考虑元组的顺序). 找 ...
- Leetcode题目200.岛屿数量(BFS+DFS+并查集-中等)
题目描述: 给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量.一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的.你可以假设网格的四个边均被水包围. 示例 ...
- Java实现 LeetCode 726 原子的数量(递归+HashMap处理)
726. 原子的数量 给定一个化学式formula(作为字符串),返回每种原子的数量. 原子总是以一个大写字母开始,接着跟随0个或任意个小写字母,表示原子的名字. 如果数量大于 1,原子后会跟着数字表 ...
随机推荐
- spring源码学习(二)
本篇文章,来介绍finishBeanFactoryInitialization(beanFactory);这个方法:这个方法主要是完成bean的实例化,invokeBeanFactoryPostPro ...
- C++学习笔记9_异常处理
异常处理 int divide(int a,int b) { if(b==0) { return -1;//然而,10,-10也是结果-1,所以要抛出异常了 } } //在异常不能通过返回值表示,也不 ...
- js简单函数(动态交互)
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> ...
- 雷神领域(并查集真是个好东西)并查集+流氓dp
考场上,整整看了半个小时以上的题目!!! 化简题意: 给定一个全0矩阵,一些坐标点(x,y)为1,当三个点可以构成一个直角三角形时(直角边长为整数)拓展为一个矩形,之后从(0,0)出发,求最多的占用行 ...
- JSP——底层原理
都知道jsp就是在HTML文件中写java代码,以实现动态页面的效果,但是这种动态是如何实现的呢?今天就在研究一下. 首先,我写了一个简单的jsp文件: <%@page import=" ...
- 使用.net core中的类DispatchProxy实现AOP
在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是软件开发中的一个热点,利用A ...
- Abp vNext 自定义 Ef Core 仓储引发异常
问题 在使用自定义 Ef Core 仓储和 ABP vNext 注入的默认仓储时,通过两个 Repository 进行 Join 操作,提示 Cannot use multiple DbContext ...
- php+mysql 实现无限极分类
php+mysql 实现无限极分类<pre>id name pid path 1 电脑 0 0 2 手机 0 0 3 笔记本 1 0-1 4 超级本 3 0-1-3 5 游戏本 3 0-1 ...
- 【Swift】UNNotificationServiceExtension
一.简介 An object that modifies the content of a remote notification before it's delivered to the user. ...
- java面试题-Java集合相关
1. ArrayList 和 Vector 的区别 ArrayList和Vector底层实现原理都是一样得,都是使用数组方式存储数据 Vector是线程安全的,但是性能比ArrayList要低. Ar ...