日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode 695 Max Area of Island

發布時間:2024/4/17 编程问答 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode 695 Max Area of Island 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目:

Given a non-empty 2D array grid of 0's and 1's, an island is a group of 1's (representing land) connected 4-directionally (horizontal or vertical.) You may assume all four edges of the grid are surrounded by water.

Find the maximum area of an island in the given 2D array. (If there is no island, the maximum area is 0.)

Example 1:

[[0,0,1,0,0,0,0,1,0,0,0,0,0],[0,0,0,0,0,0,0,1,1,1,0,0,0],[0,1,1,0,1,0,0,0,0,0,0,0,0],[0,1,0,0,1,1,0,0,1,0,1,0,0],[0,1,0,0,1,1,0,0,1,1,1,0,0],[0,0,0,0,0,0,0,0,0,0,1,0,0],[0,0,0,0,0,0,0,1,1,1,0,0,0],[0,0,0,0,0,0,0,1,1,0,0,0,0]]Given the above grid, return 6. Note the answer is not 11, because the island must be connected 4-directionally.

?

?

Example 2:

[[0,0,0,0,0,0,0,0]]Given the above grid, return 0.

?

?

Note: The length of each dimension in the given grid does not exceed 50.

?

分析:

?

分析每一個元素的特點:

如果為0, 跳過;

如果為1,向上下左右分別搜索

?

初次提交:

class Solution {
?? ?

?? ?
??? public int maxAreaOfIsland(int[][] grid) {
??????? int m = grid.length;
??????? int n = grid[0].length;
? ?
??????? int maxArea = 0;
??????? //HashMap<Integer, Integer> checkedPnt = new HashMap<Integer, Integer>();
?????? ?
??????? ArrayList<Point> visitedPoint = new ArrayList<Point>();
?????? ?
??????? for(int i=0; i<m; i++) {
??????????? for(int j=0; j<n; j++) {
??????????????? int currentArea = calculateArea(grid, i, j, visitedPoint);
??????????????? if(maxArea<currentArea) {
??????????????????? maxArea = currentArea;
??????????????? }
??????????? }
??????? }
?????? ?
??????? return maxArea;
??? }
?? ?
?? ?
??? //ArrayList<Point> visitedPoint = new ArrayList<Point>();
?? ?
??? public int calculateArea(int[][] grid, int i, int j, ArrayList<Point> visitedPoint) {
?????????? int m = grid.length;
?????????? int n = grid[0].length;
?????? ?
??????? if( !((0<=i && i<m) && (0<= j && j<m)) ) {
??????????? return 0;
??????? }
?????? ?
??????? if(grid[i][j] == 0) {
?????????? ?
??????????? return 0;
??????? }
?????? ?
??????? int area = 0;
??????? Point currentPoint = new Point(i,j);
??????? if(grid[i][j] == 1 && !visitedPoint.contains(currentPoint)) {
??????????? area++;
??????????? visitedPoint.add(currentPoint);
?????????? ?
??????????? area += calculateArea( grid, i,? j+1, visitedPoint);
??????????? area += calculateArea( grid, i,? j-1, visitedPoint);
??????????? area += calculateArea( grid, i+1,? j, visitedPoint);
??????????? area += calculateArea( grid, i-1, j, visitedPoint);
?????????? ?
??????????? return area;
??????? } else {
??????????? return area;
??????? }
?????? ?
??????? //return 0;
??? }
}

?? ?
??? class Point {
??????? public? int x;
??????????????? int y;
?????? ?
??????? public Point(int x, int y) {
??????????? this.x = x;
??????????? this.y = y;
??????? }
??? }

?結果:

Your answerException in thread "main" java.lang.StackOverflowErrorat java.util.ArrayList.contains(ArrayList.java:257)at Solution.calculateArea(Solution.java:44)at Solution.calculateArea(Solution.java:49)at Solution.calculateArea(Solution.java:48)at Solution.calculateArea(Solution.java:49)at Solution.calculateArea(Solution.java:48)at Solution.calculateArea(Solution.java:49)at Solution.calculateArea(Solution.java:48)at Solution.calculateArea(Solution.java:49)at Solution.calculateArea(Solution.java:48)at Solution.calculateArea(Solution.java:49)at Solution.calculateArea(Solution.java:48)at Solution.calculateArea(Solution.java:49)at Solution.calculateArea(Solution.java:48)at Solution.calculateArea(Solution.java:49)at Solution.calculateArea(Solution.java:48)at Solution.calculateArea(Solution.java:49)at Solution.calculateArea(Solution.java:48)at Solution.calculateArea(Solution.java:49)at Solution.calculateArea(Solution.java:48)at Solution.calculateArea(Solution.java:49)at Solution.calculateArea(Solution.java:48)at Solution.calculateArea(Solution.java:49)at Solution.calculateArea(Solution.java:48)at Solution.calculateArea(Solution.java:49)at Solution.calculateArea(Solution.java:48)at Solution.calculateArea(Solution.java:49)

?

分析:

?

o.equals(e)

?

需要重寫Point的equals 方法。或許還有hashCode方法?

?

class Solution {public int maxAreaOfIsland(int[][] grid) {int m = grid.length;int n = grid[0].length;int maxArea = 0;//HashMap<Integer, Integer> checkedPnt = new HashMap<Integer, Integer>(); ArrayList<Point> visitedPoint = new ArrayList<Point>();for(int i=0; i<m; i++) {for(int j=0; j<n; j++) {int currentArea = calculateArea(grid, i, j, visitedPoint);if(maxArea<currentArea) {maxArea = currentArea;}}}return maxArea;}//ArrayList<Point> visitedPoint = new ArrayList<Point>();public int calculateArea(int[][] grid, int i, int j, ArrayList<Point> visitedPoint) {int m = grid.length;int n = grid[0].length;if( !((0<=i && i<m) && (0<= j && j<m)) ) {return 0;}if(grid[i][j] == 0) {return 0; }int area = 0;Point currentPoint = new Point(i,j);if(grid[i][j] == 1 && !visitedPoint.contains(currentPoint)) {area++;visitedPoint.add(currentPoint);area += calculateArea( grid, i, j+1, visitedPoint);area += calculateArea( grid, i, j-1, visitedPoint);area += calculateArea( grid, i+1, j, visitedPoint);area += calculateArea( grid, i-1, j, visitedPoint);return area;} else {return area;}//return 0; } }class Point {public int x;int y;public Point(int x, int y) {this.x = x;this.y = y;}@Overridepublic boolean equals(Point point) {if(this.x == point.x && this.y == point.y) {return true;} else {return false;}}@Overridepublic int hashCode() { return Objects.hash(x, y); } }

?

修復幾個編譯錯誤:

class Solution {public int maxAreaOfIsland(int[][] grid) {int m = grid.length;int n = grid[0].length;int maxArea = 0;//HashMap<Integer, Integer> checkedPnt = new HashMap<Integer, Integer>(); ArrayList<Point> visitedPoint = new ArrayList<Point>();for(int i=0; i<m; i++) {for(int j=0; j<n; j++) {int currentArea = calculateArea(grid, i, j, visitedPoint);if(maxArea<currentArea) {maxArea = currentArea;}}}return maxArea;}//ArrayList<Point> visitedPoint = new ArrayList<Point>();public int calculateArea(int[][] grid, int i, int j, ArrayList<Point> visitedPoint) {int m = grid.length;int n = grid[0].length;if( !((0<=i && i<m) && (0<= j && j<m)) ) {return 0;}if(grid[i][j] == 0) {return 0; }int area = 0;Point currentPoint = new Point(i,j);if(grid[i][j] == 1 && !visitedPoint.contains(currentPoint)) {area++;visitedPoint.add(currentPoint);area += calculateArea( grid, i, j+1, visitedPoint);area += calculateArea( grid, i, j-1, visitedPoint);area += calculateArea( grid, i+1, j, visitedPoint);area += calculateArea( grid, i-1, j, visitedPoint);return area;} else {return area;}//return 0; } }class Point {public int x;int y;public Point(int x, int y) {this.x = x;this.y = y;}@Overridepublic boolean equals(Object object) {if(object instanceof Point) {Point point = (Point) object;return (this.x == point.x && this.y == point.y);} else {return super.equals(object);}}@Overridepublic int hashCode() { return Objects.hash(x, y); } }

?

結果:

Submission Result: Runtime Error Runtime Error Message: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1at Solution.calculateArea(Solution.java:37)at Solution.calculateArea(Solution.java:48)at Solution.maxAreaOfIsland(Solution.java:16)at __DriverSolution__.__helper__(__Driver__.java:8)at __Driver__.main(__Driver__.java:52) Last executed input: [[0],[1]]

?

分析:又是數組越界.

?

?

再次提交:

class Solution {public int maxAreaOfIsland(int[][] grid) {int m = grid.length;int n = grid[0].length;int maxArea = 0;//HashMap<Integer, Integer> checkedPnt = new HashMap<Integer, Integer>(); ArrayList<Point> visitedPoint = new ArrayList<Point>();for(int i=0; i<m; i++) {for(int j=0; j<n; j++) {int currentArea = calculateArea(grid, i, j, visitedPoint);if(maxArea<currentArea) {maxArea = currentArea;}}}return maxArea;}//ArrayList<Point> visitedPoint = new ArrayList<Point>();public int calculateArea(int[][] grid, int i, int j, ArrayList<Point> visitedPoint) {int m = grid.length;int n = grid[0].length;if( !((0<=i && i<m) && (0<= j && j<n)) ) {return 0;}if(grid[i][j] == 0) {return 0; }int area = 0;Point currentPoint = new Point(i,j);if(grid[i][j] == 1 && !visitedPoint.contains(currentPoint)) {area++;visitedPoint.add(currentPoint);area += calculateArea( grid, i, j+1, visitedPoint);area += calculateArea( grid, i, j-1, visitedPoint);area += calculateArea( grid, i+1, j, visitedPoint);area += calculateArea( grid, i-1, j, visitedPoint);return area;} else {return area;}//return 0; } }class Point {public int x;int y;public Point(int x, int y) {this.x = x;this.y = y;}@Overridepublic boolean equals(Object object) {if(object instanceof Point) {Point point = (Point) object;return (this.x == point.x && this.y == point.y);} else {return super.equals(object);}}@Overridepublic int hashCode() { return Objects.hash(x, y); } }

?

結果:

這一結果顯然時間復雜度很高。 猜測是引入了新類Point引起的。

解決辦法,看了一下這道題的solution, 可以使用一個boolean [][] seen來記錄是否被訪問過。因為島的大小不大,不會占用太多空間, 而時間上數組比ArrayList效率高。

還有一點需要注意,就是可以把遞歸轉化為迭代。 但是在本題中并不會減少時間復雜度。

?

?

修改后提交:

class Solution {public int maxAreaOfIsland(int[][] grid) {int m = grid.length;int n = grid[0].length;int maxArea = 0;int[][] seen = new int[m][n];for(int i=0; i<m; i++) {for(int j=0; j<n; j++) {int currentArea = calculateArea(grid, i, j, seen);if(maxArea<currentArea) {maxArea = currentArea;}}}return maxArea;}//ArrayList<Point> visitedPoint = new ArrayList<Point>();public int calculateArea(int[][] grid, int i, int j, int[][] seen) {int m = grid.length;int n = grid[0].length;if( !((0<=i && i<m) && (0<= j && j<n)) ) {return 0;}if(grid[i][j] == 0) {return 0; }int area = 0;//Point currentPoint = new Point(i,j);if(grid[i][j] == 1 && !(seen[i][j] == 1)) {area++;seen[i][j] = 1;area += calculateArea( grid, i, j+1, seen);area += calculateArea( grid, i, j-1, seen);area += calculateArea( grid, i+1, j, seen);area += calculateArea( grid, i-1, j, seen);return area;} else {return area;}//return 0; } }

?

結果:

?

?

修改后提交:

class Solution {public int maxAreaOfIsland(int[][] grid) {int m = grid.length;int n = grid[0].length;int maxArea = 0;int[][] seen = new int[m][n];for(int i=0; i<m; i++) {for(int j=0; j<n; j++) {int currentArea = calculateArea(grid, i, j, seen);if(maxArea<currentArea) {maxArea = currentArea;}}}return maxArea;}//ArrayList<Point> visitedPoint = new ArrayList<Point>();public int calculateArea(int[][] grid, int i, int j, int[][] seen) {int m = grid.length;int n = grid[0].length;if( !((0<=i && i<m) && (0<= j && j<n)) ) {return 0;}if(grid[i][j] == 0) {return 0; }int area = 0;//Point currentPoint = new Point(i,j);if(grid[i][j] == 1 && !(seen[i][j] == 1)) {area++;seen[i][j] = 1;/*area += calculateArea( grid, i, j+1, seen);area += calculateArea( grid, i, j-1, seen);area += calculateArea( grid, i+1, j, seen);area += calculateArea( grid, i-1, j, seen);*/return area + calculateArea( grid, i, j+1, seen) + calculateArea( grid, i, j-1, seen) + calculateArea( grid, i+1, j, seen) + calculateArea( grid, i-1, j, seen);//return area;} else {return area;}//return 0; } }

?

結果:

?

總結:

這道題花了不少時間。 主要是一開始忘記了遞歸這一利器。

為什么是深度優先遍歷呢?

轉載于:https://www.cnblogs.com/hzg1981/p/8819735.html

總結

以上是生活随笔為你收集整理的LeetCode 695 Max Area of Island的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。