力扣刷题——695.岛屿的最大面积 (!!!运行时间有点慢,待优化

695. 岛屿的最大面积

找出最大的岛屿,使用深度搜索

注意需要先检查边界再判断数组的具体值,否则会溢出

package leetcode;

public class T695 {

	public static void main(String[] args) {
		int[][] grid = { { 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 } };
		
		System.out.println(new T695().new Solution().maxAreaOfIsland(grid));
	
	}

	class Solution {

		int ans = 0;// 记录最大岛屿面积
		int tmp;// 暂时记录每次找到的岛屿面积
		boolean flag[][] = new boolean[50][50];// 初始为false
		int v[] = { 0, 1, 0, -1 }, h[] = { -1, 0, 1, 0 };// 偏移量

		public int maxAreaOfIsland(int[][] grid) {

			for (int i = 0; i < grid.length; ++i) {
				for (int j = 0; j < grid[0].length; ++j) {
					if (grid[i][j] == 1 && flag[i][j] == false) {
						tmp = 0;// 重置
						getIslandArea(grid, i, j);
						ans = Math.max(ans, tmp);
					}
				}
			}

			return ans;
		}

		public void getIslandArea(int[][] grid, int sr, int sc) {
			if (sr < 0 || sc < 0 || sr >= grid.length || sc >= grid[0].length) {// 检查边界
				return;
			}

			if (grid[sr][sc] == 1 && flag[sr][sc] == false) {// 如果为1且未标记

				tmp++;
				flag[sr][sc] = true;// 标记

				for (int i = 0; i < 4; i++) {// 四个方向
					getIslandArea(grid, sr + v[i], sc + h[i]);
				}
			}
		}
	}
}

代码运行结果有点拉,待优化。。。。


在处理输入数据时写了一个简单的工具类,熟悉一下map和StringBuilder的操作。这个工具类用于批量替换字符串中的指定符号,后续继续优化一下

package leetcode.utils;

import java.util.HashMap;
import java.util.Map;

public class StrUtils {

	private StrUtils() {
	};

	/**
	 * 改变字符串中的字符为特定字符
	 * 
	 * @param str 待改变的字符
	 * @param map map中前一个是待修改字符,第二个是修改后的字符
	 * @return 返回修改后的字符串
	 */
	public static String changeChar(String str, Map<Character, Character> map) {

		StringBuilder sBuilder = new StringBuilder(str);// StringBuilder适合修改

		for (int i = 0; i < str.length(); ++i) {
			if (map.get(sBuilder.charAt(i)) != null) {// 字符存在map中就修改
				sBuilder.replace(i, i + 1, String.valueOf(map.get(sBuilder.charAt(i))));
			}
		}

		return sBuilder.toString();
	}

	/**
	 * 测试
	 * 
	 * @param args
	 */
	public static void main(String[] args) {

		Map<Character, Character> map = new HashMap<>();
		map.put('[', '{');
		map.put(']', '}');
		System.out.println(StrUtils.changeChar("[[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]]", map));
	}

}

posted on 2023-02-17 16:44  pumpkinsBig  阅读(18)  评论(0)    收藏  举报

导航