题目地址:

https://leetcode.com/problems/the-earliest-moment-when-everyone-become-friends/

有NNN个人,标号为0,1,...,N−10,1,...,N-10,1,...,N−1。给定一个日志,形式为二维数组,每一行有三个数,第一个数代表时间,第二三个数各自都是那些人的标号。其中时间代表的是两个标号的人成为了朋友的时间。规定朋友关系是等价关系。问首次所有人成为一个等价类的时间。题目不保证日志排好序。

思路是并查集,先将日志按时间排序,然后遍历日志的同时将两个标号做union,第一次发现只剩一个等价类的时候就返回那个时间。代码如下:

import java.util.Arrays;public class Solution {class UnionFind {private int[] parent, rank;// count代表有多少个等价类private int count;UnionFind(int n) {parent = new int[n];rank = new int[n];for (int i = 0; i < n; i++) {parent[i] = i;rank[i] = 1;}count = n;}public int find(int p) {if (p != parent[p]) {parent[p] = find(parent[p]);}return parent[p];}public void union(int p, int q) {int pRoot = find(p), qRoot = find(q);if (pRoot == qRoot) {return;}if (rank[pRoot] < rank[qRoot]) {parent[pRoot] = qRoot;} else if (rank[pRoot] > rank[qRoot]) {parent[qRoot] = pRoot;} else {parent[pRoot] = qRoot;rank[qRoot]++;}// 合并了一次,等价类数量就减少1count--;}public int getCount() {return count;}}public int earliestAcq(int[][] logs, int N) {Arrays.sort(logs, (l1, l2) -> Integer.compare(l1[0], l2[0]));UnionFind uf = new UnionFind(N);for (int i = 0; i < logs.length; i++) {int x = logs[i][1], y = logs[i][2];uf.union(x, y);if (uf.getCount() == 1) {return logs[i][0];}}return -1;}
}

时间复杂度O(nlog⁡n)O(n\log n)O(nlogn)(时间主要花在了排序上,union的时间复杂度O(log⁡∗n)O(\log^*n)O(log∗n)远远小于log⁡n\log nlogn,被忽略了),空间O(n)O(n)O(n)。

【Leetcode】1101. The Earliest Moment When Everyone Become Friends相关推荐

  1. 【Leetcode】100. 相同的树

    题目 给定两个二叉树,编写一个函数来检验它们是否相同. 如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的. 示例 1: 输入: 1 1/ \ / \2 3 2 3[1,2,3], [1 ...

  2. 【leetcode】85. Maximal Rectangle 0/1矩阵的最大全1子矩阵

    1. 题目 Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing only 1 ...

  3. 【leetcode】486. Predict the Winner

    题目如下: Given an array of scores that are non-negative integers. Player 1 picks one of the numbers fro ...

  4. 【leetcode】132. Palindrome Partitioning II

    题目如下: 解题思路:本题是[leetcode]131. Palindrome Partitioning的升级版,要求的是求出最小cuts,如果用[leetcode]131. Palindrome P ...

  5. 【leetcode】86. Partition List

    题目如下: Given a linked list and a value x, partition it such that all nodes less than x come before no ...

  6. 【Leetcode】103. 二叉树的锯齿形层次遍历

    题目 给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行). 例如: 给定二叉树 [3,9,20,null,null,15,7], 3 ...

  7. 【Leetcode】79.单词搜索

    题目 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻"单元格是那些水平相邻或垂直相邻的单元格.同一个单元格 ...

  8. 【leetcode】 算法题1 两数之和

    [leetcode] 算法题1 两数之和 问题   给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用. 示例: 给定 nums ...

  9. 【Leetcode】62. 不同路径

    题目 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为"Start" ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在下图中标记为&qu ...

  10. 【Leetcode】Palindrome Number

    Determine whether an integer is a palindrome. Do this without extra space. 思路:若使用[Leetcode]Reverse I ...

最新文章

  1. office文档、图片、音/视频格式转换工具
  2. 关于css position和scroll事件的一些理解
  3. 【机器学习基础】超全汇总!机器学习常用术语词汇表(建议收藏)
  4. vue-cli 上手
  5. codesys raspberry pi_pi进不去的几种解决方法!
  6. 02331数据结构 散列表
  7. C语言运算符优先级和结合性
  8. 《编码-隐匿在计算机软硬背后的语言》第七章我们的十个数字
  9. rmi 反序列化漏洞_Java反序列化漏洞自动挖掘方法
  10. 教你写页游自动化Python脚本,取色,大漠识别和后台点击
  11. C语言冒泡排序(从小到大排序)
  12. 樽海鞘算法(SSA)
  13. 全面解读“资金二清”与“信息二清”
  14. Mac流程图制作工具推荐——Diagrams
  15. float单精度浮点和double双精度浮点
  16. Android面试题和答案
  17. matlab使用mex编译c语言报错undefined reference to `__imp_WSAStartup‘
  18. 项羽败给刘邦的一个很大原因就是项…
  19. 51单片机大作业 停车场管理系统
  20. 深度 | 腾讯 AI Lab副主任俞栋:过去两年基于深度学习的声学模型进展

热门文章

  1. android 智能手环应用,戴图智能手环app(健康手环应用) 1.7.8安卓版
  2. 幽默故事:1、我喜欢的女神;2、农村淑女(木子家原创)
  3. 无限乱斗连接服务器失败,LOL新版无限乱斗模式服务器挤爆怎么办 客户端哪些功能被限制...
  4. webx 容器初始化
  5. Office三件套批量转PDF以及PDF书签读写与加水印
  6. Ubuntu rhythombox 乱码解决
  7. NB-IoT物联网技术
  8. python入门知识点学习笔记(二)
  9. python练手经典100例项目-Python 的练手项目有哪些值得推荐?
  10. CVPR 2019 论文最新汇总(按方向划分,0611 更新中)