例如:S={-9,0,1,3,6},A=-9,B=3,C=6,MIN=0
算法解析:
解法一:枚举3个数,O(N*N*N)
解法二:对S排序后枚举其中2个数,二分查找另一个数。O(N*N*LOGN)
解法三:对S排序后枚举其中1个数X,使用双向指针i,j从数组两端更新(注意剔除X)。根据S[I]+S[J]+X的正负号来更新I或J。若为负则I++,否则J--。一旦和为0即退出。同时根据每次得到的和来更新best。最后best即为所求。利用三个变量X,Y,Z记录,可得到任一最优解。复杂度O(N*lOGN+N*N)=O(N*N)
例如S={-9,0,1,3,6,10}
X=-9
0 1 3 6 10
i j
X+S[i]+S[j]=-9+0+10=1 > 0 j--
0 1 3 6 10
i j
X+S[i]+S[j]=-9+0+6=-3 < 0 i++
0 1 3 6 10
i j
X+S[i]+S[j]=-9+1+6=-2 < 0 i++
0 1 3 6 10
i j
X+S[i]+S[j]=-9+3+6=0 = 0 quit
MIN=0,X=-9,Y=3,Z=6;
-----------------------------------------------------------------------------
算法二没看懂啊
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <algorithm> using std::sort;
int main() { int a[100], b[100]; int X,Y,Z; int i, j, k; int best; srand((unsigned)time(NULL)); int KASE = rand()%10; for(int kase = 1; kase <= KASE; kase++){ printf("/nCase #%d :/n", kase); int n = rand()%20; if(n <= 2) { printf("Sorry, n is less than 3. /n"); continue; } for(i = 0; i < n; i++){ a[i] = rand()%100; if(rand()%2) a[i] *= -1; } sort(a,a+n); for(i = 0; i < n; i++) printf("%d ", a[i]); printf("/n"); int STD = 1000000; for(i = 0; i < n; i++) for(j = i+1; j < n; j++) for(k = j+1; k < n; k++) if(abs(a[i]+a[j]+a[k]) < STD){ X = a[i]; Y = a[j]; Z = a[k]; STD = abs(a[i]+a[j]+a[k]); } printf("STD answer is: MIN=%d, X=%d Y=%d Z=%d/n", STD, X, Y, Z); best = 1000000; for(i = 0; i < n; i++){ int cur = a[i]; int cnt = 0; for(j = 0; j < n; j++){ if(j != i) b[cnt++] = a[j]; } int head = 0, tail = n-2; while(head < tail){ int now = cur + b[head] + b[tail]; if(now == 0 || abs(now) < best){ best = abs(now); X = cur; Y = b[head]; Z = b[tail]; if(now == 0) break; } if(now < 0) head++; else tail--; } if(best == 0) break; } printf("My answer is: MIN=%d, X=%d Y=%d Z=%d/n", best, X, Y, Z); } system("pause"); }
|
分享到:
相关推荐
EMC笔试题面经整理EMC笔试题面经整理EMC笔试题面经整理
作者被要求解决一系列算法问题,例如在2n+1个数中找出唯一出现一次的数。作者首先提出了一种可能的解决方案,然后不断优化,最终提出了一个时间复杂度为O(n),空间复杂度为O(1)的高效算法。面试官对于作者这种从粗略...
通过以上对2007年EMC笔试题的部分分析可以看出,EMC公司在招聘过程中非常注重应聘者的基础知识掌握程度和个人偏好。多项选择题部分的设计旨在考察应聘者在数学逻辑、算法等方面的能力,而信息收集部分则帮助公司更好...
EMC(全称是"Enterprise Memory Cache",在本文中主要指代EMC公司)是一家全球知名的存储解决方案提供商,尤其以其在数据存储、备份、恢复和云计算服务领域内的专业技术而闻名。EMC面试笔试必备的知识点涵盖了多个...
对于本题,可以通过列出所有满足条件的数(即形如\(n = 3k+1 = 5l+4 = 7m+3\)的形式),逐步找出最小的满足条件的正整数。通过计算,可以得出最小的符合条件的数为**104**。 以上是根据提供的笔试题内容所总结的...
EMC2009校园招聘笔试题答案,c++实现,可编译运行
通过上述知识点,我们可以看出EMC是一个在存储技术领域具有深厚积累和显著优势的全球性公司,其在技术研发、产品创新、企业文化和校园招聘等方面都有一系列成熟的做法和丰富的经验。对于求职者而言,EMC提供的不仅仅...
在当今竞争激烈的求职市场中,华为作为全球领先的科技公司,其招聘流程尤为严苛,尤其是笔试环节,更是成为了众多求职者挑战的起点。北京华为的经典笔试题,不仅是一份题库,更是检验应聘者是否具备华为所需专业素养...
例如,找出单向链表的倒数第k个节点,这类问题主要测试基本的数据结构操作和算法应用。 - **写作题**:用英语撰写一篇关于未来计算机发展的文章,既考察英语写作能力,也考察对行业的理解和前瞻性思考。 3. **面试...
【EMC2007笔试题】涉及到的是EMC公司2007年针对软件质量工程师一职的招聘笔试环节。EMC是一家知名的全球信息技术公司,主要提供数据存储、信息安全、云计算等解决方案。在这样的笔试中,考生可以期待遇到与软件测试...
文档标题和描述中提到的是一个EMC相关的中文题库,主要涵盖了存储技术、虚拟化、数据管理和网络协议等多个IT领域的知识点。以下是对这些知识点的详细解释: 1. 结构化数据通常指的是数据库中的数据,例如关系型...
【EMC2010年校园招聘笔试题】是一份极具价值的历史资料,它记录了全球知名存储解决方案提供商EMC在2010年面向校园招聘时所使用的测试题目。对于那些希望进入EMC工作的求职者,这份资料具有很高的参考价值,能够帮助...
在电子技术领域,尤其是对于应届毕业生寻找硬件工程师岗位的工作来说,掌握扎实的理论知识和实践...同时,不断更新和深入学习电子技术的新发展,如嵌入式系统、FPGA、物联网等前沿领域,将使你在求职过程中更具优势。