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:
?
?
Example 2:
?
?
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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 营销区块链技术的艺术
- 下一篇: Valve开发校准软件,LCD屏也能与高