[leetcode/lintcode 题解] 算法面试真题详解:尽量减少恶意软件的传播II

简介: [leetcode/lintcode 题解] 算法面试真题详解:尽量减少恶意软件的传播II

描述
在节点网络中,只有当graphi = 1 时,每个节点i能够直接连接到另一个节点j。
一些节点initial最初被恶意软件感染。只要两个节点直接连接,且其中至少一个节点受到恶意软件的感染,那么两个节点都将被恶意软件感染。这种恶意软件的传播将继续,直到没有更多的节点可以被这种方式感染。
假设 M(initial) 是在恶意软件停止传播之后,整个网络中感染恶意软件的最终节点数。
我们可以从初始列表中删除一个节点,并完全移除该节点以及从该节点到任何其他节点的任何连接。如果移除这一节点将最小化 M(initial), 则返回该节点。如果有多个节点满足条件,就返回索引最小的节点。

  1. 1 < graph.length = graph[0].length <= 300
  2. 0 <= graphi == graphj <= 1
  3. graphi = 1
  4. 1 <= initial.length < graph.length
  5. 0 <= initial[i] < graph.length

在线评测地址:领扣题库官网

样例1
输入:graph = [[1,1,0],[1,1,0],[0,0,1]], initial = [0,1]
输出:0
解释:移除0然后只有1被感染。
样例2
输入:graph = [[1,1,0],[1,1,1],[0,1,1]], initial = [0,1]
输出:1
解释:移除1然后只有0被感染。

考点

  • 图论
  • 搜索

题解
从受感染的顶点(起始顶点编号)开始dfs染色,直到找不到另一个受感染的顶点。如果当前顶点已具有其他颜色,将其排除(设置为-2)。答案是出现最多次的颜色对应的受感染的顶点或“受感染”的最小顶点(如果所有顶点至少染色2次)。

class Solution {
public:
    vector<int> col;    
        
    void dfs(vector<vector<int>>& g,unordered_set<int> &hs,int v,int c) {
        col[v] = col[v] == -1 ? c:-2;
        for(int i = 0;i < g.size();++i){
            if(g[v][i] && !hs.count(i) && col[i] != c && col[i] != -2) {
                dfs(g,hs,i,c);
            }
        }
    }
        
    int minMalwareSpread(vector<vector<int>>& g, vector<int>& in) {
        unordered_map<int,int> hm;        
        unordered_set<int> hs(in.begin(),in.end());
        int n = g.size(), res, mx=0;
        col.resize(n,-1);
        for(auto v:in) dfs(g,hs,v,v);
        for(auto v:col) {
            if(v >= 0) {
                if(++hm[v] > mx) {
                    res = v;
                    mx = hm[v];
                }
                else if(hm[v] == mx) {
                    res = min(res,v);
                }
            }
        }
        if(hm.empty()) { 
            return *min_element(in.begin(),in.end());
        }
        return res;
    }
};

更多题解参考:九章官网solution

相关文章
|
1月前
|
算法 Java 数据库
美团面试:百亿级分片,如何设计基因算法?
40岁老架构师尼恩分享分库分表的基因算法设计,涵盖分片键选择、水平拆分策略及基因法优化查询效率等内容,助力面试者应对大厂技术面试,提高架构设计能力。
美团面试:百亿级分片,如何设计基因算法?
|
1月前
|
算法 前端开发 Java
数据结构与算法学习四:单链表面试题,新浪、腾讯【有难度】、百度面试题
这篇文章总结了单链表的常见面试题,并提供了详细的问题分析、思路分析以及Java代码实现,包括求单链表中有效节点的个数、查找单链表中的倒数第k个节点、单链表的反转以及从尾到头打印单链表等题目。
32 1
数据结构与算法学习四:单链表面试题,新浪、腾讯【有难度】、百度面试题
|
27天前
|
机器学习/深度学习 算法 Java
机器学习、基础算法、python常见面试题必知必答系列大全:(面试问题持续更新)
机器学习、基础算法、python常见面试题必知必答系列大全:(面试问题持续更新)
|
1月前
|
算法 Java 数据库
美团面试:百亿级分片,如何设计基因算法?
40岁老架构师尼恩在读者群中分享了关于分库分表的基因算法设计,旨在帮助大家应对一线互联网企业的面试题。文章详细介绍了分库分表的背景、分片键的设计目标和建议,以及基因法的具体应用和优缺点。通过系统化的梳理,帮助读者提升架构、设计和开发水平,顺利通过面试。
美团面试:百亿级分片,如何设计基因算法?
|
1月前
|
算法 Java 数据中心
探讨面试常见问题雪花算法、时钟回拨问题,java中优雅的实现方式
【10月更文挑战第2天】在大数据量系统中,分布式ID生成是一个关键问题。为了保证在分布式环境下生成的ID唯一、有序且高效,业界提出了多种解决方案,其中雪花算法(Snowflake Algorithm)是一种广泛应用的分布式ID生成算法。本文将详细介绍雪花算法的原理、实现及其处理时钟回拨问题的方法,并提供Java代码示例。
67 2
|
2月前
|
机器学习/深度学习 JavaScript 算法
面试中的网红虚拟DOM,你知多少呢?深入解读diff算法
该文章深入探讨了虚拟DOM的概念及其diff算法,解释了虚拟DOM如何最小化实际DOM的更新,以此提升web应用的性能,并详细分析了diff算法的实现机制。
|
3月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
10天前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
12天前
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
37 4
|
1月前
|
JSON 安全 前端开发
第二次面试总结 - 宏汉科技 - Java后端开发
本文是作者对宏汉科技Java后端开发岗位的第二次面试总结,面试结果不理想,主要原因是Java基础知识掌握不牢固,文章详细列出了面试中被问到的技术问题及答案,包括字符串相关函数、抽象类与接口的区别、Java创建线程池的方式、回调函数、函数式接口、反射以及Java中的集合等。
28 0