面试1题解析
2012-04-11 16:04
190 查看
作者:Josunna
时间:2012年4月12日。
出处:http://blog.csdn.net/josunna。
声明:版权所有,侵犯必究。如有转载,请注明出处,谢谢!
题目:有从1到n共n个数,乱序,随意去掉其中两个数,用O(n)的时间复杂度和O(1) 的空间复杂度求是哪两个数
算法简单描述如下:
由于仅少了两个数,所以可证仅有两个链是开放的,其他的链都是闭合的。
1.标记访问过的元素
2.每次找到一个单向非闭合的链,就把它表头a[i]的下标i记录下来,并更改表头a[i]的值为表尾t。
3.最后输出记录下来的两个表尾,即是缺少的两个元素。
由1.2.保证了平均每个元素至多被访问两次。
为了简便仅举一例子说明:
为方便,考虑0到n-1这n个数
例如一共有6个数去掉了两个,3 和 5,输入为 4 2 0 1 ? ?
其中有两个链不是闭合的
a[3]=1 a[1]=2 a[2]=0 a[0]=4 a[4]=?
a[5]=?
这两个链的头的下标,即是缺少的元素
code:
时间:2012年4月12日。
出处:http://blog.csdn.net/josunna。
声明:版权所有,侵犯必究。如有转载,请注明出处,谢谢!
题目:有从1到n共n个数,乱序,随意去掉其中两个数,用O(n)的时间复杂度和O(1) 的空间复杂度求是哪两个数
算法简单描述如下:
由于仅少了两个数,所以可证仅有两个链是开放的,其他的链都是闭合的。
1.标记访问过的元素
2.每次找到一个单向非闭合的链,就把它表头a[i]的下标i记录下来,并更改表头a[i]的值为表尾t。
3.最后输出记录下来的两个表尾,即是缺少的两个元素。
由1.2.保证了平均每个元素至多被访问两次。
为了简便仅举一例子说明:
为方便,考虑0到n-1这n个数
例如一共有6个数去掉了两个,3 和 5,输入为 4 2 0 1 ? ?
其中有两个链不是闭合的
a[3]=1 a[1]=2 a[2]=0 a[0]=4 a[4]=?
a[5]=?
这两个链的头的下标,即是缺少的元素
code:
/* * 最坏情况下时间复杂度为2n即O(n),空间复杂度为O(1) 数组的每个元素平均最多被访问两次。 */ void find2ofnt(vector<int> &a, int &n1, int &n2){ int n = a.size()+2; n1 = n-1; n2 = n-2; for(int i=0, t=0; i<a.size(); ++i){ if (0>a[i]) continue; t=i; do { int tp=a[t]; a[t]=-1; t=tp; }while (0<=t && t<n-2 && t!=i); a[i]=t; if (0>t || t==i) continue; n-1==t ? n1=i:n2=i; } }
相关文章推荐
- 【面试】剑指offer题目解析及tips速查(不断更新中)
- 100道经典Hadoop常见面试/笔试题及答案解析
- BAT Android工程师面试流程解析+还原最真实最完整的一线公司面试题
- 知名互联网公司校招 Java 开发岗面试知识点解析
- 最新百度 阿里 华为 腾讯 谷歌面试笔试题及解析
- [面试] C++ 虚函数表解析
- 面试必备手写解析Json串
- C++面试及答案解析
- 安卓面试清单----OKHttp源码解析(二)
- java常见面试选择题解析
- HashMap的面试解析
- 视频教程:Java常见面试题目深度解析!
- 面试笔试系列之一 c与c++ static关键字解析
- 无领导小组讨论面试真题解析(十一)—— 面包与记者
- Top K算法详细解析—百度面试
- Top K算法详细解析---百度面试
- 知名互联网公司校招 Java 开发岗面试知识点解析
- 微软公司面试全程解析(2)
- 玩转算法面试 leetcode题库分门别类详细解析
- 常见笔试面试题目与解析(1)