clllll  

image

import java.util.HashMap;
import java.util.HashSet;

class Solution {
    public int largestIsland(int[][] grid) {
        // 思路: 遇到1,渲染,cnt++.然后统计每个岛屿的大小。
        // 遍历。遇到0 ,看上下左右分别是哪些独立的岛屿。加起来。
        int ans = 0;
        int cnt = 2; // 从2开始
        int m = grid.length;
        int n = grid[0].length;
        HashMap<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (grid[i][j] == 1) {
                    f(i, j, grid, cnt++);
                }
            }
        }
        // 统计每个岛屿的大小
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (grid[i][j] > 1) {
                    int cur = grid[i][j];
                    map.put(cur, map.getOrDefault(cur, 0) + 1);
                }

            }
        }
        if (map.getOrDefault(2, 0) == m * n) {
            // 全是1的特殊情况
            return m * n;
        }
        // 遍历每个0.如果改为1.看上下左右合起来是多少。
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (grid[i][j] == 0) {
                    ans = Math.max(ans, get(i, j, grid, map));
                }
            }
        }
        return ans + 1;
    }

    public int get(int i, int j, int[][] grid, HashMap<Integer, Integer> map) {
        HashSet<Integer> hashSet = new HashSet();

        if (i - 1 >= 0) {
            hashSet.add(grid[i - 1][j]);
        }
        if (i + 1 < grid.length) {
            hashSet.add(grid[i + 1][j]);
        }
        if (j - 1 >= 0) {
            hashSet.add(grid[i][j - 1]);
        }
        if (j + 1 < grid[0].length) {
            hashSet.add(grid[i][j + 1]);
        }
        int ans = 0;
        for (Integer cnt : hashSet) {
            ans += map.getOrDefault(cnt, 0);
        }
        return ans;

    }

    public void f(int i, int j, int[][] grid, int cnt) {
        if (i < 0 || j < 0 || i >= grid.length || j >= grid[0].length || grid[i][j] != 1) {
            return;
        }
        grid[i][j] = cnt;
        f(i + 1, j, grid, cnt);
        f(i - 1, j, grid, cnt);
        f(i, j + 1, grid, cnt);
        f(i, j - 1, grid, cnt);
    }
}
posted on 2024-12-06 20:07  llcl  阅读(4)  评论(0编辑  收藏  举报