秒杀所有岛屿题目|合集
463. 岛屿的周长
/**
* @param {number[][]} grid
* @return {number}
*/
var islandPerimeter = function(grid) {
let res=0;
let m=grid.length;
let n=grid[0].length;
//只需要计算海水和边界
for(let i=0;i<m;i++){
for(let j=0;j<n;j++){
if(grid[i][j]===1){
if(i-1<0||grid[i-1][j]===0) res++;
if(i+1==m||grid[i+1][j]===0) res++;
if(j-1<0||grid[i][j-1]===0) res++;
if(j+1==n||grid[i][j+1]===0) res++;
}
}
}
return res;
};
200. 岛屿数量
/**
* @param {character[][]} grid
* @return {number}
*/
var numIslands = function(grid) {
let m=grid.length;
let n=grid[0].length;
let res=0;
for(let i=0;i<m;i++){
for(let j=0;j<n;j++){
if(grid[i][j]==='1'){
res++;
dfs(grid,i,j);
}
}
}
return res;
};
function dfs(grid,i,j){
let m=grid.length;
let n=grid[0].length;
//判断终止条件
if(i<0||j>n-1||i>m-1||j<0){
return;
}
if(grid[i][j]==='0'){
return;
}
grid[i][j]='0';
//上下左右进行深度遍历
dfs(grid,i-1,j);
dfs(grid,i+1,j);
dfs(grid,i,j-1);
dfs(grid,i,j+1);
}
1254. 统计封闭岛屿的数目
/**
* @param {number[][]} grid
* @return {number}
*/
var closedIsland = function(grid) {
let m=grid.length;
let n=grid[0].length;
let res=0;
for(let i=0;i<m;i++){
if(grid[i][0]===0 ){
dfs(grid,i,0);
}
if(grid[i][n-1]==0){
dfs(grid,i,n-1);
}
}
for(let j=0;j<n;j++){
if(grid[0][j]===0 ){
dfs(grid,0,j);
}
if(grid[m-1][j]==0){
dfs(grid,m-1,j);
}
}
for(let i=0;i<m;i++){
for(let j=0;j<n;j++){
if(grid[i][j]===0){
res++;
dfs(grid,i,j);
}
}
}
return res;
};
function dfs(grid,i,j){
let m=grid.length;
let n=grid[0].length;
//判断终止条件
if(i<0||j>n-1||i>m-1||j<0){
return;
}
if(grid[i][j]===1){
return;
}
grid[i][j]=1;
//上下左右进行深度遍历
dfs(grid,i-1,j);
dfs(grid,i+1,j);
dfs(grid,i,j-1);
dfs(grid,i,j+1);
}
1020. 飞地的数量
/**
* @param {number[][]} grid
* @return {number}
*/
var numEnclaves = function(grid) {
let m=grid.length;
let n=grid[0].length;
let res=0;
//把上下左右都淹掉
const dfs=function(grid,i,j){
let m=grid.length;
let n=grid[0].length;
//判断终止条件
if(i<0||j>n-1||i>m-1||j<0){
return;
}
if(grid[i][j]===0){
return;
}
res++;
grid[i][j]=0;
//上下左右进行深度遍历
dfs(grid,i-1,j);
dfs(grid,i+1,j);
dfs(grid,i,j-1);
dfs(grid,i,j+1);
}
for(let i=0;i<m;i++){
if(grid[i][0]===1 ){
dfs(grid,i,0);
}
if(grid[i][n-1]==1){
dfs(grid,i,n-1);
}
}
for(let j=0;j<n;j++){
if(grid[0][j]===1 ){
dfs(grid,0,j);
}
if(grid[m-1][j]==1){
dfs(grid,m-1,j);
}
}
res=0;
for(let i=0;i<m;i++){
for(let j=0;j<n;j++){
if(grid[i][j]===1){
dfs(grid,i,j);
}
}
}
return res;
};
1905. 统计子岛屿
/**
* @param {number[][]} grid1
* @param {number[][]} grid2
* @return {number}
*/
var countSubIslands = function(grid1, grid2) {
let m=grid1.length;
let n=grid1[0].length;
let res=0;
//把上下左右都淹掉
const dfs=function(grid,i,j){
let m=grid.length;
let n=grid[0].length;
//判断终止条件
if(i<0||j>n-1||i>m-1||j<0){
return;
}
if(grid[i][j]===0){
return;
}
grid[i][j]=0;
//上下左右进行深度遍历
dfs(grid,i-1,j);
dfs(grid,i+1,j);
dfs(grid,i,j-1);
dfs(grid,i,j+1);
}
//先把不是子岛屿的淹掉
for(let i=0;i<m;i++){
for(let j=0;j<n;j++){
if(grid1[i][j]===0&&grid2[i][j]===1){
dfs(grid2,i,j);
}
}
}
//再统计
for(let i=0;i<m;i++){
for(let j=0;j<n;j++){
if(grid2[i][j]===1){
res++;
dfs(grid2,i,j);
}
}
}
return res;
};
剑指 Offer II 105. 岛屿的最大面积
/**
* @param {number[][]} grid
* @return {number}
*/
var maxAreaOfIsland = function(grid) {
let m=grid.length;
let n=grid[0].length;
let count=0;
let max=0;
const dfs=function(grid,i,j){
let m=grid.length;
let n=grid[0].length;
//判断终止条件
if(i<0||j>n-1||i>m-1||j<0){
return;
}
if(grid[i][j]===0){
return;
}
count++;
grid[i][j]=0;
//上下左右进行深度遍历
dfs(grid,i-1,j);
dfs(grid,i+1,j);
dfs(grid,i,j-1);
dfs(grid,i,j+1);
}
for(let i=0;i<m;i++){
for(let j=0;j<n;j++){
if(grid[i][j]===1){
dfs(grid,i,j);
if(count>max) max=count;
count=0;
}
}
}
return max;
};
剑指 Offer 12. 矩阵中的路径
/**
* @param {character[][]} board
* @param {string} word
* @return {boolean}
*/
var exist = function(board, word) {
if(word.length===0) return false;
let m=board.length;
let n=board[0].length;
const dfs=(board,w,i,j)=>{
if(w==="") return true;
if(i<0||i>=m||j<0||j>=n) return false;//判断边界
if(w[0]!=board[i][j]) return false;
let temp=board[i][j];//暂存,以后还原
board[i][j]="#";
if(
dfs(board,w.slice(1),i-1,j)||
dfs(board,w.slice(1),i+1,j)||
dfs(board,w.slice(1),i,j-1)||
dfs(board,w.slice(1),i,j+1)
)
{ board[i][j]=temp;
return true;
}
else{
board[i][j]=temp;
return false;
}
//注意要还原,以免其他遍历需要这个变量
}
for(let i=0;i<m;i++){
for(let j=0;j<n;j++){
if(board[i][j]===word[0]){
if( dfs(board,word,i,j))
return true;
}
}
}
return false;
};
剑指 Offer 13. 机器人的运动范围
/**
* @param {number} m
* @param {number} n
* @param {number} k
* @return {number}
*/
var movingCount = function(m, n, k) {
let visited=Array(m).fill(0).map(item =>{ return Array
(n).fill(false)});//创建m*n数组
//去除重复
console.log(visited)
const dfs=(visited,i,j)=>{
console.log(bitsum(i)+'#'+bitsum(j))
console.log('-----'+i)
if(i>=m || j>=n || bitsum(i)+bitsum(j)>k || visited[i][j]) return 0;
//向右和向下
visited[i][j]=true;
return 1+dfs(visited,i+1,j)+dfs(visited,i,j+1);
}
const bitsum=(u)=>{
let sum=0;
while(u) {
sum += u % 10;
u = Math.floor(u / 10);
}
return sum;
}
return dfs(visited,0,0);
};
阅读剩余
版权声明:
作者:chun
链接:https://chun53.top/1414.html
文章版权归作者所有,未经允许请勿转载。
THE END