首页 > 编程语言 >力扣-图论-8【算法学习day.58】

力扣-图论-8【算法学习day.58】

时间:2024-12-10 21:33:21浏览次数:6  
标签:图论 day.58 int long 力扣 vis bombs dx

前言

###我做这类文章一个重要的目的还是给正在学习的大家提供方向和记录学习过程(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非常非常高滴!!!


习题

1.引爆最多的炸弹

题目链接:2101. 引爆最多的炸弹 - 力扣(LeetCode)

题面:

分析:本质上还是求单向最大连通图,只不过连通的条件改成了能不能引爆 ,贴上灵神代码

代码:

class Solution {
    public int maximumDetonation(int[][] bombs) {
        int n = bombs.length;
        List<Integer>[] g = new ArrayList[n];
        Arrays.setAll(g, i -> new ArrayList<>());
        for (int i = 0; i < n; i++) {
            long x = bombs[i][0];
            long y = bombs[i][1];
            long r = bombs[i][2];
            for (int j = 0; j < n; j++) {
                long dx = x - bombs[j][0];
                long dy = y - bombs[j][1];
                if (j != i && dx * dx + dy * dy <= r * r) {
                    g[i].add(j); // i 可以引爆 j
                }
            }
        }

        int ans = 0;
        boolean[] vis = new boolean[n];
        for (int i = 0; i < n && ans < n; i++) {
            Arrays.fill(vis, false);
            ans = Math.max(ans, dfs(g, vis, i));
        }
        return ans;
    }

    private int dfs(List<Integer>[] g, boolean[] vis, int x) {
        vis[x] = true;
        int cnt = 1;
        for (int y : g[x]) {
            if (!vis[y]) {
                cnt += dfs(g, vis, y);
            }
        }
        return cnt;
    }
}

后言

上面是力扣图论专题,下一篇是其他的习题,希望有所帮助,一同进步,共勉!

标签:图论,day.58,int,long,力扣,vis,bombs,dx
From: https://blog.csdn.net/2301_79232523/article/details/144380014

相关文章

  • 力扣周赛427
    力扣周赛427......
  • 单词拼写纠正-04-161.力扣 相隔为 1 的编辑距离
    拼写纠正系列NLP中文拼写检测实现思路NLP中文拼写检测纠正算法整理NLP英文拼写算法,如果提升100W倍的性能?NLP中文拼写检测纠正Paperjava实现中英文拼写检查和错误纠正?可我只会写CRUD啊!一个提升英文单词拼写检测性能1000倍的算法?单词拼写纠正-03-leetcodeedit-d......
  • 力扣746 使用最小花费爬楼梯
    问题描述:给你一个整数数组cost,其中cost[i]是从楼梯第i个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。你可以选择从下标为0或下标为1的台阶开始爬楼梯。请你计算并返回达到楼梯顶部的最低花费。示例一:输入:cost=[10,15,20]输出:15......
  • 【唐叔学算法】第八天:并查集-图论连通性的大杀器
    你是否曾为如何高效地解决图论中的连通性问题而烦恼?并查集算法,就像一张无形的网,能帮你轻松连接所有节点。今天,就让我们一起揭开并查集算法的神秘面纱,探索它在Java编程中的应用。并查集是什么?并查集(Union-Find)是一种数据结构,用于处理一些不交集的合并及查询问题。它支持两......
  • 力扣392.判断子序列
    首先本题有两种解题思路:1.利用双指针遍历s与t,挨个判断s中的元素是否在t中存在,具体方法:i,j 两个指针从0开始,如果s[j]==t[i],则i++,j++;如果不等于则只是i++;继续比较s[j]==t[i];直到i=t.size(),跳出循环,最后判断j是否等于s.size()即可。双指针classSolution{......
  • 力扣300.最长递增子序列(动态规划)
    注:本文只是为了记录作者在刷题过程中的一下思路和心得。思路:每次考虑以第i个元素结尾时能够构成的最长子序列。例如:nums=[0,1,3,2],我们从下标为0的元素开始考虑,如果以下标为0的元素结尾,那么这个子序列的长度就为1;然后依次我们考虑后面的元素。当我们考虑到第i个元......
  • 力扣718.最长重复子数组
    思路:用动态规划的思路,即建立dp[n][m],其中n表示nums1的长度,m表示表示nums2的长度,首先明确:d[i][j]的意义,他表示以nums1[i]元素结尾的字符串和以nums2[j]元素结尾的字符串他们的重复子数组的最大长度。其次:当nums1[i]==nums2[j]时,dp[i][i]=dp[i-1][j-1]+1;dp初始化,首先我们只......
  • 力扣2.两数相加
    链表两数相加的问题与数组里面大数相加的问题一样。思路:我们从头开始遍历两个链表,当两个链表都没有到头时,我们正常将该节点的值进行相加,并且建立新的节点来保存当前位的值,加入到前面结果的结尾,同时保存进位的值;若当前任意一个链表没有到达末尾,我们应该继续运算,在运算时把已经......
  • 每日力扣打卡143.重排链表
    题目:给定一个单链表L的头节点head,单链表L表示为:L0→L1→…→Ln-1→Ln请将其重新排列后变为:L0→Ln→L1→Ln-1→L2→Ln-2→…不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。示例1:输入:head=[1,2,3,4]输出:[1,4,2,3]示......
  • 算法日记 43-44 day 图论(深搜,广搜)
    直接看题目,还是熟悉写法。题目:孤岛的总面积101.孤岛的总面积(kamacoder.com)题目描述给定一个由1(陆地)和0(水)组成的矩阵,岛屿指的是由水平或垂直方向上相邻的陆地单元格组成的区域,且完全被水域单元格包围。孤岛是那些位于矩阵内部、所有单元格都不接触边缘的岛屿。现在......