首页 > 编程 > C++ > 正文

463. Island Perimeter (C++)

2019-11-06 06:09:54
字体:
来源:转载
供稿:网友

题目:

You are given a map in form of a two-dimensional integer grid where 1 rePResents land and 0 represents water. Grid cells are connected horizontally/vertically (not diagonally). The grid is completely surrounded by water, and there is exactly one island (i.e., one or more connected land cells). The island doesn’t have “lakes” (water inside that isn’t connected to the water around the island). One cell is a square with side length 1. The grid is rectangular, width and height don’t exceed 100. Determine the perimeter of the island.

Example: [[0,1,0,0], [1,1,1,0], [0,1,0,0], [1,1,0,0]]

Answer: 16 https://leetcode.com/problems/island-perimeter/?tab=Description

翻译

您将获得一个二维整数网格形式的地图,其中1表示土地,0表示水。 网格单元水平/垂直(不是对角线)连接。 网格完全被水包围,并且恰好有一个岛(即,一个或多个连接的陆地单元)。 岛上没有“湖泊”(里面的水是不连接到岛周围的水)。 一个单元格是边长为1的正方形。网格是矩形,宽度和高度不超过100.确定岛的周长。

思路:

主要就是找规律,就想过马路一样,行人都是往前看,往右看,遵守这条规律,大家都不会发生碰撞(产生冗余) 找规律制定规则: 1. 遇到“1”时计数器“+4“,因为一个单独存在与空间的方格有四个边。 2. 向右看,向下看,如果发现有“1”则计数器“-2”,发现一次减一次,发现两次减两次,因为两个连在一起的话总线条数会减少两条。 3. 每次遍历先略过最右边一列以及最下边一行这些边界情况,因为它们的规则不太一样。 4. 边界规则:最右边一列遇到“1”只看下面有没有“1”,没有右边的所以不看。最下面一行遇到“1”只看右边有没有“1”,因为他下面没有东西。边界情况身边有“1”则计数器“-2”。边界规则不包含最右下角的那个元素,因为它既没有右边也没有下边。 5. 最右下角元素:如果是“1”,计数器“+4”,不用担心左边上面,因为该减的都减过了。

解答:

把上面的规则按顺序写下来就是答案 下面是我给出的答案,(84.23%,132ms)

class Solution {public: int islandPerimeter(vector<vector<int>>& grid) { int row = grid.size(); if (!row) return 0; int col = grid[0].size(); if (!col) return 0; int ret = 0; for (int i = 0; i < row-1; ++i) { for (int j = 0; j < col-1; ++j) { if (grid[i][j] == 1) { ret += 4; if (grid[i + 1][j] == 1) ret -= 2; if (grid[i][j + 1] == 1) ret -= 2; } } } for (int i = 0; i < row - 1; ++i) { if (grid[i][col-1] == 1) { ret += 4; if (grid[i + 1][col-1] == 1) ret -= 2; } } for (int i = 0; i < col - 1; ++i) { if (grid[row-1][i] == 1) { ret += 4; if (grid[row-1][i+1] == 1) ret -= 2; } } if (grid[row-1][col-1] == 1) { ret += 4; /*if (grid[row - 2][col - 1] == 1) { ret--; } if (grid[row - 1][col - 2] == 1) { ret--; }*/ } return ret; }};
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选