1615. 最大网络秩


给你一个节点个数和一个双向边集,要求返回任意两个点的度的和的最大值,如果这两个点直接相连,那之间的边只算一次,总数就要-1。
我们直接遍历双向边集,统计每个节点的度,同时用哈希表记录节点之间的连接情况。然后用 n 2 n^2 n2 时间去遍历所有节点的组合,寻找节点度之和的最大值,如果这两个节点之间有边,就在和的基础上-1。

模拟ac

class Solution {public:int maximalNetworkRank(int n, vector<vector<int>>& roads) {vector<int> ans(n,0);vector<vector<int>> vis(n,vector<int> (n,0));int len=roads.size();int res=0;for(auto road:roads){ans[road[0]]++;ans[road[1]]++;vis[road[0]][road[1]]++;vis[road[1]][road[0]]++;}for(int i=0;i<n;i++){for(int j=i+1;j<n;j++){res=max(res,ans[i]+ans[j]-(vis[i][j]||vis[j][i]));}}return res;}
};

尝试优化

毫无疑问, n 2 n^2 n2 时间肯定不是最优的,只超越了29%。
然后尝试在遍历边集的时候维护一个最大值 f i r s t first first 和一个次大值 s e c o n d second second,最后判断一下二者之间是不是直连。若,则答案为 f i r s t + s e c o n d first+second first+second,否则为 f i r s t + s e c o n d − 1 first+second-1 first+second−1。

class Solution {public:int maximalNetworkRank(int n, vector<vector<int>>& roads) {vector<int> ans(n,0);int len=roads.size();int res=0;int first_num=0,firts_city;int second_num=0,second_city;for(int i=0;i<len;i++){int x=roads[i][0];int y=roads[i][1];ans[x]++;if(ans[x]>=first_num){//更新最大值second_num=first_num;second_city=firts_city;first_num=ans[x];firts_city=x;}else if(ans[x]>=second_num){//更新次大值second_num=ans[x];second_city=x;}ans[y]++;if(ans[y]>=first_num){second_num=first_num;second_city=firts_city;first_num=ans[y];firts_city=y;}else if(ans[y]>=second_num){second_num=ans[y];second_city=y;}}res=first_num+second_num;// cout<<firts_city<<" "<<second_city<<endl;for(int i=0;i<len;i++){int x=roads[i][0];int y=roads[i][1];if((x==firts_city&&y==second_city)||(x==second_city&&y==firts_city)){// cout<<"flag";res-=1;break;}}for(int i=0;i<n;i++){cout<<i<<" "<<ans[i]<<endl;}return res;}
};

但是我们没法在更新的同时去考虑这两个点之间是否有重复边,所以可能得到的结果会比实际值小1。如下图所示,0和3、0和4,这两个节点组合的度之和都是4,然而由于在边集中[0,4]位置靠后,所以0和3的组合会被更新成0和4,然而0和4并不是最优组合,他俩之间有直连的边,而0和3之间没有,所以最后的结果比真实值小1。


优化ac

既然结果偏差是因为遗漏组合导致的,那我们把度数等于 f i r s t first first 和 s e c o n d second second 的点拿出来组合一下不就好了嘛。具体怎么做呢,前半部分和上面一样,得到最大值和次大值之后,我们遍历一遍统计度数的数组,每次拿这个最大值和次大值去和当前点计算一下度数和(包含直连判断),就得到答案了!三言两语说不太清楚,具体看代码注释。只需要 O ( m + n ) O(m+n) O(m+n)时间。

数组全都开大一个是为了给 f i r s t _ c i t y first\_city first_city 和 s e c o n d _ c i t y second\_city second_city 赋初值以解决边集为空的情况。如果边集为空,那 f i r s t _ c i t y first\_city first_city 和 s e c o n d _ c i t y second\_city second_city 就需要等于1~n-1之外的值,而这个下标需要进一步访问数组所以数组全都开大一格, f i r s t _ c i t y first\_city first_city 和 s e c o n d _ c i t y second\_city second_city 初值均为n。

class Solution {public:int maximalNetworkRank(int n, vector<vector<int>>& roads) {vector<int> ans(n+1,0);//记录点的度数vector<vector<int>> vis(n+1,vector<int> (n+1,0));//哈希表,记录两个点之间是否直连int len=roads.size();int res=0;int first_num=0,firts_city=n;int second_num=0,second_city=n;for(int i=0;i<len;i++){int x=roads[i][0];int y=roads[i][1];vis[x][x]++;vis[y][x]++;ans[x]++;if(ans[x]>=first_num){//更新最大值和最大度数的节点编号second_num=first_num;second_city=firts_city;first_num=ans[x];firts_city=x;}else if(ans[x]>=second_num){//更新次大值second_num=ans[x];second_city=x;}ans[y]++;if(ans[y]>=first_num){second_num=first_num;second_city=firts_city;first_num=ans[y];firts_city=y;}else if(ans[y]>=second_num){second_num=ans[y];second_city=y;}}for(int i=0;i<n;i++){if(i!=firts_city){//必须判重,不能两个节点和自己组合//用布尔运算一次性判断是否直连和减去重合边res=max(res,first_num+ans[i]-(vis[firts_city][i]||vis[i][firts_city]));}if(i!=second_city){res=max(res,second_num+ans[i]-(vis[second_city][i]||vis[i][second_city]));}}return res;}
};

菩萨蛮 【清·纳兰性德】

新寒中酒敲窗雨,残香细袅秋情绪。才道莫伤神,青衫湿一痕。 无聊成独卧,弹指韶光过。记得别伊时,桃花柳万丝。

  1. 中酒:非醉非醒的状态。

【LeetCode 每日一题】1615. 最大网络秩(medium)相关推荐

  1. LeetCode 1615. 最大网络秩 / 2389. 和有限的最长子序列 / 1626. 无矛盾的最佳球队(排序+动态规划)

    1615. 最大网络秩 2023.3.15 每日一题 题目描述 n 座城市和一些连接这些城市的道路 roads 共同组成一个基础设施网络.每个 roads[i] = [ai, bi] 都表示在城市 a ...

  2. Leetcode每日一题总目录(动态更新。。。)

    0. 概要 leecode每日一题(也可能多题)题解跟踪记录及总目录. 常用算法解题思路和技巧及数据结构: 预处理:数组排序(954),哈希表... 双指针法 682,125,905 单向链表 2 双 ...

  3. leetcode每日刷题计划-简单篇day8

    leetcode每日刷题计划-简单篇day8 今天是纠结要不要新买手机的一天QAQ想了想还是算了吧,等自己赚钱买,加油 Num 70 爬楼梯 Climbing Stairs class Solutio ...

  4. Leetcode每日一题:171.excel-sheet-column-number(Excel表列序号)

    思路:就是168题的反命题,进制的方式完美解决: Leetcode每日一题:168.excel-sheet-column-title(Excel表名称) class Solution {public: ...

  5. 【LeetCode每日一题】1723. 完成所有工作的最短时间

    [LeetCode每日一题]1723. 完成所有工作的最短时间 [1] 1723. 完成所有工作的最短时间 [2] 473. 火柴拼正方形 [1] 1723. 完成所有工作的最短时间 题目: 给你一个 ...

  6. leetcode每日一题--雀巢原理;抽屉算法;Quorum机制;分布式应用

    leetcode每日一题 539. 最小时间差 示例 1: 输入:timePoints = ["23:59","00:00"] 输出:1 示例 2: 输入:ti ...

  7. LeetCode每日一题——1812. 判断国际象棋棋盘中一个格子的颜色

    LeetCode每日一题系列 题目:1812. 判断国际象棋棋盘中一个格子的颜色 难度:简单 文章目录 LeetCode每日一题系列 题目 示例 思路 题解 题目 给你一个坐标 coordinates ...

  8. 【LeetCode每日一题】——109.有序链表转换二叉搜索树

    文章目录 一[题目类别] 二[题目难度] 三[题目编号] 四[题目描述] 五[题目示例] 六[题目提示] 七[解题思路] 八[时间频度] 九[代码实现] 十[提交结果] 一[题目类别] 二叉树 二[题 ...

  9. leetcode每日一题·救生艇问题(Python)

    leetcode每日一题·救生艇问题(Python) 问题描述 题目入口 题目思路 首先分析问题,一个船最多坐两人,因此我们可以把这个问题看作两两组合的问题,并且如果最重的那个人和最轻的人加起来大于l ...

最新文章

  1. mysql的字符串函数大全_MySQL的字符串函数大全
  2. 31、如何安装第三方模块?以及用过哪些第三方模块?
  3. To be a true man
  4. ‘fopen‘: this function or variable may be unsafe.
  5. PHP(Thinkphp框架)将数据表导出csv文件
  6. mysql 各表charset不同_MySQL表字段字符集不同导致的索引失效问题
  7. GPU Gems1 - 18 空间BRDF(Spatial BRDFs)
  8. 又一起.NET程序挂死, 用 Windbg 抽丝剥茧式的真实案例分析
  9. [SQL]实战之查找员工编号emp_no为10001其自入职以来的薪水salary涨幅值growth
  10. 古谚、评论与论断、名篇与名言
  11. 【图像去雾】基于matlab偏振水下模糊图像去雾【含Matlab源码 396期】
  12. 【PCB学习笔记】绘制智能车四层板 --- DRC检查,拼版设计及资料输出
  13. jQuery用DOM遍历实现商城结算系统
  14. 小写转大写金额 php,php小写金额转大写
  15. fatal: unable to connect to gitee.com: gitee.com[0: 180.97.125.228]: errno=Unknown error
  16. 对于电商尺码跟颜色组成的表格输入框,对输入框的操作
  17. android 游戏降低画质6,怎么改善安卓游戏画面?
  18. Vue-3D-Model:几行代码即可构造出炫酷三维场景
  19. css的hue-rotate是调整了色相吗?
  20. 手把手教你入门 Git 教程,图文实例详解

热门文章

  1. Parking-lot
  2. 运用citespace做分析流程
  3. 下列变量名不符合python命名规范的是_下列不合法的Python变量名是________
  4. IOS升级到13后发现左划的自定义按钮不存在了,但是事件依旧可以响应
  5. 洛谷P3645 [APIO2015]雅加达的摩天楼
  6. e-企业管理解决方案-供应链管理系统
  7. 图像处理之图像特征及提取
  8. Linux、CentOS 安装CUDA、cuDNN、PyTorch教程
  9. 常见web漏洞原理,危害,防御方法
  10. 大数据开发技术与实践期末复习(HITWH)