当前位置: 首页 > 面试题库 >

算法题:名人问题,给出最优解法

壤驷彦
2023-03-14
本文向大家介绍算法题:名人问题,给出最优解法相关面试题,主要包含被问及算法题:名人问题,给出最优解法时的应答技巧和注意事项,需要的朋友参考一下

参考回答:

问题描述:

有n个人他们之间认识与否用邻接矩阵表示(1表示认识,0表示不认识),并A认识B并不意味着B认识A,也就意味着是个有向图。如果一个人是名人,他必须满足两个条件,一个是他不认识任何人,另一个是所有人必须都认识他。

解决问题:

用一个数组保存所有没检查的人的编号,遍历数组中的两个人i,j。如果i认识j,则i必定不是名人,删除i,如果i不认识j,则j必定不是名人,删除j,最终会只剩下一个人,我们检查一下这个人是否是名人即可,如果是,返回这个人,如果不是,那么这n个人中并无名人。

代码:

//初始化数组编号

for(int i=a;i<n;i++){
a[i]=i;
}
while(n>1){
if(known[a[0]][a[1]]){
//如果a[0]号认识a[1]号
//删除a[0],删除操作用a[n]替换掉a[0]即可,再将n下标减1
a[0]=a[--n];
}else{
//如果a[0]号不认识a[1]号
//删除a[1]
a[1]=a[--n];
}
}
//最终检查a[0]是否为名人

for(int i=0;i<n;++i){

//不考虑自身,并且检查他是否认识某个人,如果认识,那么不是名人
//检查其他人是否认识他,如果有人不认识他,那么他也不是名人
if((a[0]!=i)&&(known[a[0]][i]||!known[i][a[0]]))
return -1;
}
return a[0];
}

算法优化:

以上算法需要用一个数组来保存没有检查的人的编号,意味着空间复杂度为O(n),是否可以让空间复杂度降低到O(1)呢,答案是肯定的,解决方法就是用一头扫的方法

这里我们就不需要用一个数组来保存没有检查的人的编号了,我们直接对n个人进行html" target="_blank">遍历

遍历的方式是定义两个下标,用两个下标一起往后扫,对于两个下标i,j而言,保证[o~i-1]没有名人,并且[i~j-1]也没有名人,如果i认识j,那么i不是名人,删掉i,删除的方法就是i=j,j++,如果i不认识j,删除j,删除的方式是j++,遍历的时候让j一直加就可以了。

int i=0;j=1;
for(;j<n;++j){
if(known[a[i]a[j]])
i=j;
}
for(j=0;j<n;j++){
if((i!=j)&&(known[i][j]||!known[j][i]))
return -1;
}
return i;
}

算法优化2:

除了一头扫的优化方式,也可以用两头扫的方式优化以上的算法,保证0~i-1没有名人,并且j+1~n也没有名人,如果i认识j,删除i,如果i不认识j,删除j

i=0;j=n-1;
while(i<j){
if(known[i][j]){
++i;
}else{
--j;
}
}
for(j=0;j<n;++j){
if(i!=j&&(known[i][j]||!known[j][i]))
return -1
}
return i;
}
 类似资料:
  • 本文向大家介绍算法题:topK给出3种解法?相关面试题,主要包含被问及算法题:topK给出3种解法?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 1)局部淘汰法 -- 借助“冒泡排序”获取TopK 思路:(1)可以避免对所有数据进行排序,只排序部分;(2)冒泡排序是每一轮排序都会获得一个最大值,则K轮排序即可获得TopK。 时间复杂度空间复杂度:(1)时间复杂度:排序一轮是O(N),则K

  • 我已经创建了一个C程序来模拟非抢占式最短作业优先算法,但它在某些输入上有缺陷。最短作业优先算法程序接受所需数量的过程的到达和突发时间的输入,并将过程安排在两个阶段中。第一阶段涉及根据到达时间来安排节目,第二阶段根据突发时间来安排节目,假设它们的到达时间低于前一过程完成的时间。这一切最终都会被编译并显示出来。 这些是预期的结果: 这些是我通过我的程序获得的结果: 任何帮助都将不胜感激。谢谢!

  • Reference 【必读】An overview of gradient descent optimization algorithms - Sebastian Ruder 梯度下降 ../数学/梯度下降法 梯度下降是一种优化算法,通过迭代的方式寻找模型的最优参数; 所谓最优参数指的是使目标函数达到最小值时的参数; 当目标函数是凸函数时,梯度下降的解是全局最优解;但在一般情况下,梯度下降无法保证

  • 有人能帮我找到我的PQ的问题吗?

  • 前言 算法主要包括: 1、排序 排序一定要准备。 2、堆栈、队列、链表 队列和链表可以不准备,但是堆栈一定要准备。 一个小技巧:JS的数组本身就具备堆栈和队列的特性。比如:top、push、shift、unshift这四个api,本身就帮我们实现了堆栈和队列。 堆栈:先进后出。 3、递归 递归是一定不能偷懒的。算法比较难的时候,一般要用到递归。 4、波兰式和逆波兰式 总结: 比如阿里,如果基础题答

  • Angel是一个分布式机器学习平台,在上面运行算法,得到模型,这只是第一步,更加关键第二步,训练出来模型,要有比较好的准确率,可以对数据进行准确预测。在这个过程中,用户可能会遇到各种各样的问题,这里我们也一一总结一下 LR 模型不收敛,预测效果差 请检查正则项系数是否适合,过大的正则项参数会影响模型收敛,建议不大于 1/featureNum 检查Learn Rate是否过大 检查数据预处理是否有做