面试算法整理.pdf

  1. 1、本文档共105页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
面试算法整理

算法摘自:剑指offer,编程之美,C++编程关键路径,程序员求职宝典 1. 数组中出现次数超过一半的数字(剑指offer 29 题 编程之美 寻找发帖水王) 解法一:基于快排中分割算法的方法 数组中有一个数字出现的次数超过了数组长度的一半。如果把这个数组排序, 那么排序之后位于数组中间的数字一定就是那个出现次数超过数组长度一半的数字。 也就是说,这个数字是统计学上的中位数,即长度为n 的数组中第n/2 大的数 字。我们有成熟的O(n)算法得到数组中任意第k 大的数字。 这种算法是受快速排序算法的启发,在随机快排中,先随机选择一个数字,然 后将比它小的数字都放在它的左边,比它大的都放在它的右边。 如果调整好位置后,这个选中的数字的下标刚好是 n/2,那么这个数字就是数 组中的中位数。 如果它的下标大于 n/2,那么中位数应该在它的左边,可以接着在它的左边查 找;下标小于n/2 的情况类似,这是一个典型的递归过程。 当然,在这其中要考虑输入无效的情况(数组指针为NULL);也要考虑如果输 入的数组中出现频率最高的数字并没有达到出现次数超过数组长度一半的情况。 #include stdio.h int Partition(int A[],int low,int high) { int pivot=A[low]; while(low high) { while(lowhigh A[high]=pivot) --high; A[low]=A[high]; while(lowhigh A[low]=pivot) ++low; A[high]=A[low]; } A[low]=pivot; return low; } int HalfData(int a[],int len) { int start=0; int end=len-1; int middle=len 1; int index=Partition(a,start,end); printf(index1:%d\n,index); while(index != middle) { if(index middle) { end=index-1; index=Partition(a,start,end); } else { start=index+1; index=Partition(a,start,end); } } return a[index]; } void main() { int a[9]={1,2,3,2,2,2,5,4,2}; int len=9; int result=HalfData(a,9); printf(result:%d,result); } 解法二:根据数组特点找出O(n)的算法 数组中有一个数字出现的次数超过数组长度的一半,也就是说它出现的次数比 其他所有数字出现的次数的和还要多。 因此我们可以考虑用两个变量:一个保存一个数字,一个保存次数。 开始时,保存数组中第一个元素,次数设置为1; 遍历数组: 如果下一个数字和之前保存的数字相同,则次数递增1; 如果下一个数字和之前保存的数字不同,则次数递减1;

文档评论(0)

yaocen + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档