题目地址:

https://www.lintcode.com/problem/444/

要求设计一个数据结构,可以做如下两个操作:
1、void addEdge(int a, int b)在aaa与bbb两个点之间连边;
2、bool isValidTree()问当前的图是否是一棵树。

由于不知道aaa和bbb的取值范围,可以采用离散化的方式,动态开点。总体思路是并查集。询问的时候只需要看一下是否集合个数是111并且没有环,可以用一个变量记录集合个数,另一个变量记录是否有环。代码如下:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;public class Solution {List<Integer> p;Map<Integer, Integer> map;// group是集合个数int idx, group;// isValid记录是否无环boolean isValid;public Solution() {p = new ArrayList<>();map = new HashMap<>();isValid = true;}int find(int x) {if (x != p.get(x)) {p.set(x, find(p.get(x)));}return p.get(x);}void union(int x, int y) {int px = find(x), py = find(y);if (px == py) {// 有环了,标记一下isValid = false;return;}p.set(px, py);group--;}/*** @param a: the node a* @param b: the node b* @return: nothing*/public void addEdge(int a, int b) {// write your code here// 动态开点if (!map.containsKey(a)) {group++;p.add(idx);map.put(a, idx++);}if (!map.containsKey(b)) {group++;p.add(idx);map.put(b, idx++);}int x = map.get(a), y = map.get(b);union(x, y);}/*** @return: check whether these edges make up a valid tree*/public boolean isValidTree() {// write your code herereturn isValid && group == 1;}
}

加边时间复杂度O(log⁡∗n)O(\log ^*n)O(log∗n),nnn是已经加的点的个数,查询时间O(1)O(1)O(1),空间O(n)O(n)O(n)。

【Lintcode】444. Graph Valid Tree II相关推荐

  1. 【SPOJ】Count On A Tree II(树上莫队)

    [SPOJ]Count On A Tree II(树上莫队) 题面 洛谷 Vjudge 洛谷上有翻译啦 题解 如果不在树上就是一个很裸很裸的莫队 现在在树上,就是一个很裸很裸的树上莫队啦. #incl ...

  2. 【Lintcode】1354. Pascal‘s Triangle II

    题目地址: https://www.lintcode.com/problem/pascals-triangle-ii/description 计算杨辉三角的第nnn行,从000开始计数.用两个list ...

  3. 【LeetCode】图论 graph(共20题)

    [133]Clone Graph (2019年3月9日,复习) 给定一个图,返回它的深拷贝. 题解:dfs 或者 bfs 都可以 1 /* 2 // Definition for a Node. 3 ...

  4. 【LeetCode】剑指 Offer 55 - II. 平衡二叉树

    [LeetCode]剑指 Offer 55 - II. 平衡二叉树 文章目录 [LeetCode]剑指 Offer 55 - II. 平衡二叉树 一.后序遍历 + 剪枝(从底至顶) 一.后序遍历 + ...

  5. 【LeetCode】剑指 Offer 68 - II. 二叉树的最近公共祖先

    [LeetCode]剑指 Offer 68 - II. 二叉树的最近公共祖先 文章目录 [LeetCode]剑指 Offer 68 - II. 二叉树的最近公共祖先 一.DFS 一.DFS 祖先的定义 ...

  6. 【机器学习】决策树(Decision Tree)

    [机器学习]k近邻算法(KNN) [机器学习]决策树(Decision Tree) [机器学习]朴素贝叶斯(Naive Bayes) 一.概述 决策树(Decision Tree)是有监督学习中的一种 ...

  7. 【LeetCode】剑指 Offer 59 - II. 队列的最大值

    [LeetCode]剑指 Offer 59 - II. 队列的最大值 文章目录 [LeetCode]剑指 Offer 59 - II. 队列的最大值 package offer;import java ...

  8. 【LeetCode】剑指 Offer 58 - II. 左旋转字符串

    [LeetCode]剑指 Offer 58 - II. 左旋转字符串 文章目录 [LeetCode]剑指 Offer 58 - II. 左旋转字符串 一.字符串切片 二.列表遍历拼接 三.字符串遍历拼 ...

  9. 【LeetCode】剑指 Offer 32 - II. 从上到下打印二叉树 II

    [LeetCode]剑指 Offer 32 - II. 从上到下打印二叉树 II 文章目录 [LeetCode]剑指 Offer 32 - II. 从上到下打印二叉树 II 一.层序遍历 BFS 一. ...

最新文章

  1. OSPF高级设置实现全网互通
  2. 一份 Spring Boot 项目搭建模板
  3. 图解 Java 垃圾回收机制,写得非常好!
  4. Grunt-几个常用的任务配置,加载,执行的写法
  5. django_models_关系一对多
  6. 动态规划原理介绍(附7个算例,有代码讲解)
  7. linux空文件夹大小,[转载]linux 查看文件和文件夹大小
  8. arm poky linux,Solved: Re: arm-poky-linux - NXP Community
  9. React和Vue的模块化
  10. 一本名不符实的.NET书籍: Game Engine Toolset Development
  11. 移动物联卡资费标准是如何的
  12. 为什么会找不到D层文件?
  13. php自动生成word目录,word怎么自动生成目录
  14. 2022年自动化专业、电气工程及其自动化专业大学生可以参加哪些专业相关的竞赛?
  15. 挑战微软 + GitHub!谷歌联手 Replit,升级 AI 编程“神器”:曾拒绝微软 10 亿美元的收购...
  16. 基于C语言的个人所得税计税系统
  17. “知识库系统”的一些思考
  18. Python调用百度API进行身份证识别
  19. 联想u310 u410已组好RAID即启用了IRST而因意外不能进入系统要(重装系统方法)
  20. c语言输出菱形for循环_c语言for循环如何打印菱形

热门文章

  1. IT公司软件工程师薪水排名
  2. 【转】一个女留学生在美国的七年
  3. Apache Dubbo 之 内核剖析
  4. Project Euler in Java [001-040]
  5. ubuntu kylin 16.04系统的基本安装
  6. 使用UltraISO(软碟通)制作U盘启动盘完整教程
  7. SM1算法的EBC、CBC、OFB模式及其介绍
  8. 2011年华为企业业务的15件大事
  9. 西部数据移动硬盘检测与分区
  10. 入门python爬虫