《剑指offer》 图专项突破

这篇具有很好参考价值的文章主要介绍了《剑指offer》 图专项突破。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

第十五章:图

面试题105:最大的岛屿

题目

海洋岛屿地图可以用由01组成的二维数组表示,水平或者竖直方向相连的一组1表示一个岛屿。请计算最大的岛屿的面积(即岛屿中1的数目)。例如,在图15.5中有4个岛屿,其中最大的岛屿的面积为5

《剑指offer》 图专项突破,java,面试,算法
图15.5:用01矩阵表示的海洋岛屿地图。地图中有4个岛屿,最大的岛屿的面积为5

参考代码

解法一
public int maxAreaOfIsland(int[][] grid) {
   
    int rows = grid.length;
    int cols = grid[0].length;
    boolean[][] visited = new boolean[rows][cols];
    int maxArea = 0;
    for (int i = 0; i < rows; i++) {
   
        for (int j = 0; j < cols; j++) {
   
            if (grid[i][j] == 1 && !visited[i][j]) {
   
                int area = getArea(grid, visited, i, j);
                maxArea = Math.max(maxArea, area);
            }
        }
    }

    return maxArea;
}

private int getArea(int[][]grid, boolean[][] visited, int i, int j) {
   
    Queue<int[]> queue = new LinkedList<>();
    queue.add(new int[]{
   i, j});
    visited[i][j] = true;

    int[][] dirs = {
   {
   -1, 0}, {
   1, 0}, {
   0, -1}, {
   0, 1}};
    int area = 0;
    while (!queue.isEmpty()) {
   
        int[] pos = queue.remove();
        area++;

        for (int[] dir : dirs) {
   
            int r = pos[0] + dir[0];
            int c = pos[1] + dir[1];
            if (r >= 0 && r < grid.length
                && c >= 0 && c < grid[0].length
                && grid[r][c] == 1 && !visited[r][c]) {
   
                queue.add(new int[]{
   r, c});
                visited[r][c] = true;
            }
        }
    }

    return area;
}
解法二
public int maxAreaOfIsland(int[][] grid) {
   
    int rows = grid.length;
    int cols = grid[0].length;
    boolean[][] visited = new boolean[rows][cols];
    int maxArea = 0;
    for (int i = 0; i < rows; i++) {
   
        for (int j = 0; j < cols; j++) {
   
            if (grid[i][j] == 1 && !visited[i][j]) {
   
                int area = getArea(grid, visited, i, j);
                maxArea = Math.max(maxArea, area);
            }
        }
    }

    return maxArea;
}

private int getArea(int[][]grid, boolean[][] visited, int i, int j) {
   
    Stack<int[]> stack = new Stack<>();
    stack.push(new int[]{
   i, j});
    visited[i][j] = true;

    int[][] dirs = {
   {
   -1, 0}, {
   1, 0}, {
   0, -1}, {
   0, 1}};
    int area = 0;
    while (!stack.isEmpty()) {
   
        int[] pos = stack.pop();
        area++;

        for (int[] dir : dirs) {
   
            int r = pos[0] + dir[0];
            int c = pos[1] + dir[1];
            if (r >= 0 && r < grid.length
                && c >= 0 && c < grid[0].length
                && grid[r][c] == 1 && !visited[r][c]) {
   
                stack.push(new int[]{
   r, c});
                visited[r][c] = true;
            }
        }
    }

    return area;
}
解法三
public int maxAreaOfIsland(int[][] grid) {
   
    int rows = grid.length;
    int cols = grid[0].length;
    boolean[][] visited = new boolean[rows][cols];
    int maxArea = 0;
    for (int i = 0; i < rows; i++) {
   
        for (int j = 0; j < cols; j++) {
   
            if (grid[i][j] == 1 && !visited[i][j]) {
   
                int area = getArea(grid, visited, i, j);
                maxArea = Math.max(maxArea, area);
            }
        }
    }

    return maxArea;
}

    private int getArea(int[][]grid, boolean[][] visited, int i, int j) {
   
        int area = 1;
        visited[i][j] = true;
        int[][] dirs = {
   {
   -1, 0}, {
   1, 0}, {
   0, -1}, {
   0, 1}};
        for (int[] dir : dirs) {
   
            int r = i + dir[0];
            int c = j + dir[1];
            if (r >= 0 && r < grid.length
                && c >= 0 && c < grid[0].length
                && grid[r][c] == 1 && !visited[r][c]) {
   
                area += getArea(grid, visited, r, c);
            }
        }
        
        return area;
    }

面试题106:二分图

题目

如果能将一个图的结点分成AB两部分,使得任意一条边的一个结点属于A另一个结点属于B,那么该图就是一个二分图。输入一个由数组graph表示的图,graph[i]里包含所有和结点i相邻的结点,请判断该图是否为二分图。例如,如果输入graph[[1, 3], [0, 2], [1, 3], [0, 2]],那么我们可以将结点分为{0, 2}{1, 3}两部分,因此该图是一个二分图,如图15.7(a)所示。如果输入graph[[1,2,3],[0,2],[0,1,3],[0,2]],则不是一个二分图,如图15.7(b)所示。

《剑指offer》 图专项突破,java,面试,算法
图15.7:二分图与非二分图。(a)二分图。(b)不是二分图。文章来源地址https://www.toymoban.com/news/detail-795043.html

参考代码

解法一
public boolean isBipartite(int[][] graph) {
   
    int size = graph.length;
    int[] colors = new int[size];
    Arrays.fill(colors, -1);
    for (int i = 0; i < size; ++i) {
   
        if (colors[i] == -1) {
   
            if (!setColor(graph, colors, i, 0)) {
   
                return false;
            }
        }
    }

    return true;
}

private boolean setColor(int[][] graph, int[] colors, int i, int color) {
   
    Queue<Integer> queue = new LinkedList<>();
    queue.add(i);
    colors[i] = color;
    while (!queue.isEmpty()) {
   
        int v = queue.remove();
        for (int neighbor : graph[v]) {
   
            if (colors[neighbor] >= 0) {
   
                if (colors[neighbor] == colors[v]) {
   
                    return false;
                }
            } else {
   
                queue.add(neighbor);
                colors[neighbor] = 1 - colors[v];
            }
        }
    }

    return true;
}
解法二
public boolean isBipartite(int[][] graph) {
   
    int size = graph.length;
    int[] colors = new int[size]

到了这里,关于《剑指offer》 图专项突破的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 《剑指offer》专项突破

    题目 输入两个 int 型整数,求它们除法的商,要求不得使用乘号’ * ‘、除号’ / ‘以及求余符号’ % \\\'。当发生溢出时返回最大的整数值。假设除数不为 0 。例如,输入 15 和 2 ,输出 15/2 的结果,即 7 。 参考代码 题目 输入两个表示 二进制 的字符串,请计算它们的和,并以

    2024年02月01日
    浏览(43)
  • 《剑指offer》 图专项突破

    题目 海洋岛屿地图可以用由 0 、 1 组成的二维数组表示,水平或者竖直方向相连的一组 1 表示一个岛屿。请计算最大的岛屿的面积(即岛屿中 1 的数目)。例如,在图15.5中有 4 个岛屿,其中最大的岛屿的面积为 5 。 图15.5:用 0 、 1 矩阵表示的海洋岛屿地图。地图中有 4 个岛

    2024年01月16日
    浏览(51)
  • 【周末闲谈】剑指offer,了解面试,学会面试

    我们在找工作时,需要结合自己的现状,针对意向企业做好充分准备。作为程序员,你有哪些面试IT技术岗的技巧? 你可以从一下几个方向谈谈你的想法和观点。 个人主页:【😊个人主页】 系列专栏:【❤️周末闲谈】 你是否在为未来可能到来的面试感到担心受怕,别害怕

    2024年02月15日
    浏览(31)
  • 剑指offer面试题4 替换空格

    分析: 关于字符串的考点无非就是字符串的遍历以及关于字符串类型本身提供的方法,后者其实主要考察你对语言本身是否足够熟悉,比如java语言中String类型支持哪些方法,这个太具体了,不太符合对抽象的数据结构和算法的考察标准。因此思路还是要往提升时间或者空间

    2024年01月16日
    浏览(31)
  • 剑指offer面试题6 重建二叉树

    分析 本题目输入的一个树的前序和中序遍历序列,要求把这颗树重建起来。这里需要了解到程序中有个特别重要的思维叫递归,递归是分层的,每一层的问题都是一样的,只不过问题的规模不一样,面对这类复杂问题你的思考方式一定是2点:1.问题该如何定义?第n层该如何

    2024年01月18日
    浏览(30)
  • 剑指offer面试题8 旋转数组的最小数字

    分析 首先一定要记住只要看到排序数组的查找,思维一定要往二分法上靠,然后再思考清楚如何利用二分法。而如何利用二分法一定要仔细分析所给的数组的特点:递增数组且最开始的若干元素搬到数组的末尾,相当于该数组由俩个递增小数组构成,前面的数组元素肯定大于

    2024年01月24日
    浏览(31)
  • 《剑指offer》(3)排序算法篇

    class Solution:     def duplicate(self , numbers: List[int]) - int:         if len(numbers) = 1:             return -1         import collections         num_dict = collections.Counter(numbers)         res = [key for (key,value) in num_dict.items() if value 1]         return res[0] class Solution:     def sort(self,num): #快排

    2024年02月13日
    浏览(28)
  • 20场面试斩获大厂offer,你在我这能学到什么?,面试真题解析 某市开展安全生产专项整治小宋在

    先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7 深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前! 因此收集整理了一份《2024年最新Android移动开发全套学习资

    2024年04月25日
    浏览(34)
  • 从零学算法 (剑指 Offer 13)

    地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+

    2024年02月11日
    浏览(25)
  • 从零学算法(剑指 Offer 45)

    输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。 示例 1: 输入: [10,2] 输出: “102” 示例 2: 输入: [3,30,34,5,9] 输出: “3033459” 我的原始人解法:直接冒泡排序,把最先应该拼接的那个数不断后移,然后拼接即可。关键就

    2024年02月10日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包