代码拉取完成,页面将自动刷新
遍历方式: 1. 双层for循环, 2. while操作双下标 3. 递归 统计的思路是:
public static int[] dx = {-1, 0, 1, 0};
public static int[] dy = {0, -1, 0, 1};
int x = i + dx[e];
int y = j + dx[e];
总结: 遍历方法 + 配合任意算法,都可以求出结果,当然有些遍历方法配合某一个思路更完美
遍历方式,3种我都想到, 但是统计的思路,我只想到一种,求某个陆地所有有效边,所有陆地所有效边求和 ,递归的时候,没有找到最好的递归点
class Solution {
public int islandPerimeter(int[][] grid) {
int perimeter = 0;
for (int i = 0; i < grid.length; i++) {
for (int j = 0; j < grid[i].length; j++) {
int place = grid[i][j];
if (place == 0) {
continue;
}
int c = 4;
if (i - 1 >= 0) {
if (grid[i - 1][j] == 1) {
c--;
}
}
if (j - 1 >= 0) {
if (grid[i][j - 1] == 1) {
c--;
}
}
if (i + 1 < grid.length) {
if (grid[i + 1][j] == 1) {
c--;
}
}
if (j + 1 < grid[i].length) {
if (grid[i][j + 1] == 1) {
c--;
}
}
perimeter += c;
}
}
return perimeter;
}
}
class Solution {
public int islandPerimeter(int[][] grid) {
int land = 0;
int border = 0;
for (int i = 0; i < grid.length; i++) {
for (int j = 0; j < grid[i].length; j++) {
if (grid[i][j] == 1) {
land++;
if (i + 1 < grid.length) {
if (grid[i + 1][j] == 1) {
border++;
}
}
if (j + 1 < grid[i].length) {
if (grid[i][j + 1] == 1) {
border++;
}
}
}
}
}
return 4 * land - 2 * border;
}
}
class Solution {
public int islandPerimeter(int[][] grid) {
int n = grid.length, m = grid[0].length, perimeter = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (grid[i][j] == 1) {
for (int e = 0; e < dx.length; e++) {
int x = i + dx[e];
int y = j + dy[e];
if (x < 0 || x >= n || y < 0 || y >= m || grid[x][y] == 0) {
perimeter++;
}
}
}
}
}
return perimeter;
}
}
理论上,这个应该是最优,因为通过递归,规避很多非陆地遍历过程,但是实际运行结果却很差
class Solution {
public int myOwnWayOfThinkingFour(int[][] grid) {
int row = grid.length, column = grid[0].length;
int sum = 0;
for (int i = 0; i < row; row++) {
for (int j = 0; j < column; j++) {
if (grid[i][j] == 1) {
sum += dfs(grid, i, j, row, column);
}
}
}
return sum;
}
public int dfs(int[][] grid, int x, int y, int row, int column) {
// 边界算一个边, 或者说外面不是陆地算一个边
if (x < 0 || x >= row || y < 0 || y >= column || grid[x][y] == 0) {
return 1;
}
if (grid[x][y] == 2) {
return 0;
}
grid[x][y] = 2;
int res = 0;
for (int i = 0; i < dx.length; i++) {
res += dfs(grid, x + dx[i], y + dy[i], row, column);
}
return res;
}
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。