【华为OD题库-097】最大岛屿体积-java

题目

题目描述
给你一个由大于0的数(陆地)和0(水)组成的的二维网格,请你计算网格中最大岛屿的体积。陆地的数表示所在岛屿的体积。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。
输入描述
第一行是二维网格的宽和高。后面几行是二维网格。
输出描述
输出岛屿的最大体积。
样例
输入
5 5
0 1 1 0 0
0 1 1 0 0
0 0 0 0 0
0 0 1 2 3
0 0 1 3 9
输出
19

思路

dfs递归处理即可得到每个岛屿的体积,最后返回最大体积即可

题解

package hwod;

import java.util.Scanner;

public class MaxIslandVolume {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int m = sc.nextInt();
        int n = sc.nextInt();
        int[][] grids = new int[m][n];
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                grids[i][j] = sc.nextInt();
            }
        }
        System.out.println(maxIslandVolume(grids));
    }

    private static int[] x_axis = new int[]{1, 0, -1, 0};
    private static int[] y_axis = new int[]{0, 1, 0, -1};

    private static int area;

    private static int maxIslandVolume(int[][] grids) {
        int res = Integer.MIN_VALUE;
        int m = grids.length;
        if (m == 0) return 0;
        int n = grids[0].length;
        int[] used = new int[m * n];
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (grids[i][j] != 0 && used[i * n + j] == 0) {
                    area = 0;
                    recur(grids, i, j, used);
                    res = Math.max(area, res);
                }
            }
        }
        return res;
    }

    private static void recur(int[][] grids, int i, int j, int[] used) {
        int m = grids.length, n = grids[0].length;
        area += grids[i][j];
        used[i * n + j] = 1;
        for (int k = 0; k < 4; k++) {
            int nx = i + x_axis[k];
            int ny = j + y_axis[k];
            if (nx >= 0 && nx < m && ny >= 0 && ny < n && used[nx * n + ny] != 1 && grids[nx][ny] != 0) {
                recur(grids, nx, ny, used);
            }
        }
    }
}

推荐

如果你对本系列的其他题目感兴趣,可以参考华为OD机试真题及题解(JAVA),查看当前专栏更新的所有题目。

说明

本专栏所有文章均为原创,欢迎转载,请注明文章出处:https://blog.csdn.net/qq_31076523/article/details/134176793。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。

华为OD机试-最大化控制资源成本Java题目要求我们设计一个解决方案,以最大程度地控制资源成本。在Java中,我们可以通过以下方法来实现: 1. 使用线程池:Java提供了Executor框架,可以用来管理和重复利用线程。通过使用线程池,我们可以避免频繁地创建和销毁线程,从而节省了系统的资源开销。 2. 资源的动态管理:动态管理资源的使用是很重要的,我们可以通过合理分配资源的数量,最大化地控制资源成本。比如,可以根据当前系统的负载情况来动态调整线程池的大小,从而避免资源的浪费。 3. 内存的优化:在Java中,通过合理地利用内存,可以有效地节省资源成本。比如,可以使用缓存机制,将一些频繁访问的数据缓存在内存中,从而减少对数据库或其他资源的访问次数。 4. 避免资源泄漏:资源泄漏是很容易发生的,如果不及时释放资源,会导致资源的浪费和系统的崩溃。在Java的开发中,我们需要及时地释放所使用的资源,比如关闭文件、释放数据库连接等。 5. 使用轻量级的框架:在Java开发中,选择合适的框架也会对资源成本的最大化控制起到影响。轻量级的框架比如Spring Boot等,可以帮助我们减少额外的资源负担。 总之,通过合理地运用线程池、动态管理资源、优化内存、避免资源泄漏以及选择合适的框架,我们可以最大化地控制资源成本,提高系统的性能和效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值