463. Island Perimeter
Дан массив размером row x col, представляющий карту, где grid[i][j] = 1 обозначает сушу, а grid[i][j] = 0 обозначает воду.
Клетки сетки соединены горизонтально/вертикально (не по диагонали). Сетка полностью окружена водой, и на ней находится ровно один остров (т.е. одна или более соединённых ячеек суши).
У острова нет "озёр", то есть вода внутри не соединена с водой вокруг острова. Одна ячейка - это квадрат со стороной 1. Сетка прямоугольная, ширина и высота не превышают 100. Определите периметр острова.
Пример:
Input: grid = [[0,1,0,0],[1,1,1,0],[0,1,0,0],[1,1,0,0]]
Output: 16
Explanation: The perimeter is the 16 yellow stripes in the image above.
C# решение
сопоставлено/оригиналpublic class Solution {
public int IslandPerimeter(int[][] grid) {
int rows = grid.Length;
int cols = grid[0].Length;
int result = 0;
for (int r = 0; r < rows; r++) {
for (int c = 0; c < cols; c++) {
if (grid[r][c] == 1) {
int up = (r == 0) ? 0 : grid[r-1][c];
int left = (c == 0) ? 0 : grid[r][c-1];
int down = (r == rows-1) ? 0 : grid[r+1][c];
int right = (c == cols-1) ? 0 : grid[r][c+1];
result += 4 - (up + left + right + down);
}
}
}
return result;
}
}
C++ решение
auto-draft, проверить перед отправкой#include <bits/stdc++.h>
using namespace std;
// Auto-generated C++ draft from the C# solution. Review containers, LINQ and helper types before submit.
class Solution {
public:
public int IslandPerimeter(int[][] grid) {
int rows = grid.size();
int cols = grid[0].size();
int result = 0;
for (int r = 0; r < rows; r++) {
for (int c = 0; c < cols; c++) {
if (grid[r][c] == 1) {
int up = (r == 0) ? 0 : grid[r-1][c];
int left = (c == 0) ? 0 : grid[r][c-1];
int down = (r == rows-1) ? 0 : grid[r+1][c];
int right = (c == cols-1) ? 0 : grid[r][c+1];
result += 4 - (up + left + right + down);
}
}
}
return result;
}
}
Java решение
сопоставлено/оригиналpublic class Solution {
public int islandPerimeter(int[][] grid) {
int rows = grid.length;
int cols = grid[0].length;
int result = 0;
for (int r = 0; r < rows; r++) {
for (int c = 0; c < cols; c++) {
if (grid[r][c] == 1) {
int up = (r == 0) ? 0 : grid[r-1][c];
int left = (c == 0) ? 0 : grid[r][c-1];
int down = (r == rows-1) ? 0 : grid[r+1][c];
int right = (c == cols-1) ? 0 : grid[r][c+1];
result += 4 - (up + left + right + down);
}
}
}
return result;
}
}
JavaScript решение
сопоставлено/оригиналclass Solution {
islandPerimeter(grid) {
const rows = grid.length;
const cols = grid[0].length;
let result = 0;
for (let r = 0; r < rows; r++) {
for (let c = 0; c < cols; c++) {
if (grid[r][c] === 1) {
const up = (r === 0) ? 0 : grid[r-1][c];
const left = (c === 0) ? 0 : grid[r][c-1];
const down = (r === rows-1) ? 0 : grid[r+1][c];
const right = (c === cols-1) ? 0 : grid[r][c+1];
result += 4 - (up + left + right + down);
}
}
}
return result;
}
}
Python решение
сопоставлено/оригиналclass Solution:
def islandPerimeter(self, grid: List[List[int]]) -> int:
rows = len(grid)
cols = len(grid[0])
result = 0
for r in range(rows):
for c in range(cols):
if grid[r][c] == 1:
up = 0 if r == 0 else grid[r-1][c]
left = 0 if c == 0 else grid[r][c-1]
down = 0 if r == rows-1 else grid[r+1][c]
right = 0 if c == cols-1 else grid[r][c+1]
result += 4 - (up + left + right + down)
return result
Go решение
сопоставлено/оригиналpackage main
func islandPerimeter(grid [][]int) int {
rows := len(grid)
cols := len(grid[0])
result := 0
for r := 0; r < rows; r++ {
for c := 0; c < cols; c++ {
if grid[r][c] == 1 {
up := 0
if r != 0 {
up = grid[r-1][c]
}
left := 0
if c != 0 {
left = grid[r][c-1]
}
down := 0
if r != rows-1 {
down = grid[r+1][c]
}
right := 0
if c != cols-1 {
right = grid[r][c+1]
}
result += 4 - (up + left + right + down)
}
}
}
return result
}
Algorithm
Пройти через каждую ячейку сетки и, когда вы находитесь в ячейке с значением 1 (ячейка суши), проверить окружающие (СВЕРХУ, СПРАВА, СНИЗУ, СЛЕВА) ячейки.
Ячейка суши без каких-либо окружающих ячеек суши будет иметь периметр 4. Вычесть 1 за каждую окружающую ячейку суши.
Когда вы находитесь в ячейке с значением 0 (ячейка воды), ничего не делать. Просто перейти к следующей ячейке.
😎
Вакансии для этой задачи
Показаны активные вакансии с пересечением по тегам задачи.