代码随想录算法训练营第52天

101.孤岛的总面积

基础题目 可以自己尝试做一做 。

代码随想录

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
import java.util.Vector;

public class Main {
    private static int count = 0;
    private static int[][] dir = {{0, 1}, {1, 0}, {-1, 0}, {0, -1}};

    public static void bfs(Vector<Vector<Integer>> grid, int x, int y) {
        Queue<Pair> que = new LinkedList<>();
        que.add(new Pair(x, y));
        grid.set(x, y, 0);
        count++;
        while (!que.isEmpty()) {
            Pair cur = que.poll();
            int curx = cur.x;
            int cury = cur.y;
            for (int i = 0; i < 4; i++) {
                int nextx = curx + dir[i][0];
                int nexty = cury + dir[i][1];
                if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid.get(0).size()) continue;
                if (grid.get(nextx).get(nexty) == 1) {
                    que.add(new Pair(nextx, nexty));
                    count++;
                    grid.set(nextx, nexty, 0);
                }
            }
        }
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int m = scanner.nextInt();
        Vector<Vector<Integer>> grid = new Vector<>(n);
        for (int i = 0; i < n; i++) {
            grid.add(new Vector<>(m));
            for (int j = 0; j < m; j++) {
                grid.get(i).add(scanner.nextInt());
            }
        }
        for (int i = 0; i < n; i++) {
            if (grid.get(i).get(0) == 1) bfs(grid, i, 0);
            if (grid.get(i).get(m - 1) == 1) bfs(grid, i, m - 1);
        }
        for (int j = 0; j < m; j++) {
            if (grid.get(0).get(j) == 1) bfs(grid, 0, j);
            if (grid.get(n - 1).get(j) == 1) bfs(grid, n - 1, j);
        }
        count = 0;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (grid.get(i).get(j) == 1) bfs(grid, i, j);
            }
        }
        System.out.println(count);
    }

    static class Pair {
        int x;
        int y;

        Pair(int x, int y) {
            this.x = x;
            this.y = y;
        }
    }
}

102.沉没孤岛

和上一题差不多,尝试自己做做

代码随想录

import java.util.Scanner;
import java.util.Vector;

public class Main {
    private static int[][] dir = {{-1, 0}, {0, -1}, {1, 0}, {0, 1}};

    public static void dfs(Vector<Vector<Integer>> grid, int x, int y) {
        grid.set(x, y, 2);
        for (int i = 0; i < 4; i++) {
            int nextx = x + dir[i][0];
            int nexty = y + dir[i][1];
            if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid.get(0).size()) continue;
            if (grid.get(nextx).get(nexty) == 0 || grid.get(nextx).get(nexty) == 2) continue;
            dfs(grid, nextx, nexty);
        }
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int m = scanner.nextInt();
        Vector<Vector<Integer>> grid = new Vector<>(n);
        for (int i = 0; i < n; i++) {
            grid.add(new Vector<Integer>(m));
            for (int j = 0; j < m; j++) {
                grid.get(i).add(scanner.nextInt());
            }
        }

        for (int i = 0; i < n; i++) {
            if (grid.get(i).get(0) == 1) dfs(grid, i, 0);
            if (grid.get(i).get(m - 1) == 1) dfs(grid, i, m - 1);
        }

        for (int j = 0; j < m; j++) {
            if (grid.get(0).get(j) == 1) dfs(grid, 0, j);
            if (grid.get(n - 1).get(j) == 1) dfs(grid, n - 1, j);
        }

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (grid.get(i).get(j) == 1) grid.get(i).set(j, 0);
                if (grid.get(i).get(j) == 2) grid.get(i).set(j, 1);
            }
        }

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                System.out.print(grid.get(i).get(j) + " ");
            }
            System.out.println();
        }
    }
}

103.水流问题

需要点优化思路,建议先自己读题,相处一个解题方法,有时间就自己写代码,没时间就直接看题解,优化方式 会让你 耳目一新。

代码随想录

import java.util.Scanner;
import java.util.Vector;

public class Main {
    private static int n, m;
    private static int[][] dir = {{-1, 0}, {0, -1}, {1, 0}, {0, 1}};

    public static void dfs(Vector<Vector<Integer>> grid, Vector<Vector<Boolean>> visited, int x, int y) {
        if (visited.get(x).get(y)) return;

        visited.set(x, y, true);

        for (int i = 0; i < 4; i++) {
            int nextx = x + dir[i][0];
            int nexty = y + dir[i][1];
            if (nextx < 0 || nextx >= n || nexty < 0 || nexty >= m) continue;
            if (grid.get(x).get(y) < grid.get(nextx).get(nexty)) continue;

            dfs(grid, visited, nextx, nexty);
        }
    }

    public static boolean isResult(Vector<Vector<Integer>> grid, int x, int y) {
        Vector<Vector<Boolean>> visited = new Vector<>(n, new Vector<>(m, false));

        dfs(grid, visited, x, y);
        boolean isFirst = false;
        boolean isSecond = false;

        for (int j = 0; j < m; j++) {
            if (visited.get(0).get(j)) {
                isFirst = true;
                break;
            }
        }
        for (int i = 0; i < n; i++) {
            if (visited.get(i).get(0)) {
                isFirst = true;
                break;
            }
        }
        for (int j = 0; j < m; j++) {
            if (visited.get(n - 1).get(j)) {
                isSecond = true;
                break;
            }
        }
        for (int i = 0; i < n; i++) {
            if (visited.get(i).get(m - 1)) {
                isSecond = true;
                break;
            }
        }
        return isFirst && isSecond;
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        n = scanner.nextInt();
        m = scanner.nextInt();
        Vector<Vector<Integer>> grid = new Vector<>(n);
        for (int i = 0; i < n; i++) {
            grid.add(new Vector<Integer>(m));
            for (int j = 0; j < m; j++) {
                grid.get(i).add(scanner.nextInt());
            }
        }

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (isResult(grid, i, j)) {
                    System.out.println(i + " " + j);
                }
            }
        }
    }
}

104.建造最大岛屿

同样优化思路也会让你耳目一新,自己想比较难想出来。

import java.util.Scanner;
import java.util.Vector;
import java.util.HashMap;
import java.util.HashSet;

public class Main {
    private static int[][] dir = {{0, 1}, {1, 0}, {-1, 0}, {0, -1}};
    private static int n, m;
    private static int count;

    public static void dfs(Vector<Vector<Integer>> grid, Vector<Vector<Boolean>> visited, int x, int y, int mark) {
        if (visited.get(x).get(y) || grid.get(x).get(y) == 0) return;
        visited.set(x, y, true);
        grid.set(x, y, mark);
        count++;
        for (int i = 0; i < 4; i++) {
            int nextx = x + dir[i][0];
            int nexty = y + dir[i][1];
            if (nextx < 0 || nextx >= n || nexty < 0 || nexty >= m) continue;
            dfs(grid, visited, nextx, nexty, mark);
        }
    }

    public static int largestIsland(int n, int m, Vector<Vector<Integer>> grid) {
        Vector<Vector<Boolean>> visited = new Vector<>(n, new Vector<>(m, false));
        HashMap<Integer, Integer> gridNum = new HashMap<>();
        int mark = 2;
        boolean isAllGrid = true;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (grid.get(i).get(j) == 0) isAllGrid = false;
                if (!visited.get(i).get(j) && grid.get(i).get(j) == 1) {
                    count = 0;
                    dfs(grid, visited, i, j, mark);
                    gridNum.put(mark, count);
                    mark++;
                }
            }
        }
        if (isAllGrid) {
            return n * m;
        }

        int result = 0;
        HashSet<Integer> visitedGrid = new HashSet<>();
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (grid.get(i).get(j) == 0) {
                    count = 1;
                    visitedGrid.clear();
                    for (int k = 0; k < 4; k++) {
                        int neari = i + dir[k][0];
                        int nearj = j + dir[k][1];
                        if (neari < 0 || neari >= n || nearj < 0 || nearj >= m) continue;
                        if (visitedGrid.contains(grid.get(neari).get(nearj))) continue;
                        count += gridNum.getOrDefault(grid.get(neari).get(nearj), 0);
                        visitedGrid.add(grid.get(neari).get(nearj));
                    }
                }
                result = Math.max(result, count);
            }
        }
        return result;
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        n = scanner.nextInt();
        m = scanner.nextInt();
        Vector<Vector<Integer>> grid = new Vector<>(n);
        for (int i = 0; i < n; i++) {
            grid.add(new Vector<Integer>(m));
            for (int j = 0; j < m; j++) {
                grid.get(i).add(scanner.nextInt());
            }
        }
        int largestArea = largestIsland(n, m, grid);
        System.out.println(largestArea);
    }
}

代码随想录

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
代码随想录算法训练营是一个优质的学习和讨论平台,提供了丰富的算法训练内容和讨论交流机会。在训练营中,学员们可以通过观看视频讲解来学习算法知识,并根据讲解内容进行刷题练习。此外,训练营还提供了刷题建议,例如先看视频、了解自己所使用的编程语言、使用日志等方法来提高刷题效果和语言掌握程度。 训练营中的讨论内容非常丰富,涵盖了各种算法知识点和解题方法。例如,在第14训练营中,讲解了二叉树的理论基础、递归遍历、迭代遍历和统一遍历的内容。此外,在讨论中还分享了相关的博客文章和配图,帮助学员更好地理解和掌握二叉树的遍历方法。 训练营还提供了每日的讨论知识点,例如在第15的讨论中,介绍了层序遍历的方法和使用队列来模拟一层一层遍历的效果。在第16的讨论中,重点讨论了如何进行调试(debug)的方法,认为掌握调试技巧可以帮助学员更好地解决问题和写出正确的算法代码。 总之,代码随想录算法训练营是一个提供优质学习和讨论环境的平台,可以帮助学员系统地学习算法知识,并提供了丰富的讨论内容和刷题建议来提高算法编程能力。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [代码随想录算法训练营每日精华](https://blog.csdn.net/weixin_38556197/article/details/128462133)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值