找出数组中第二大的数
2015-07-25 21:32
357 查看
#include<iostream> #include<cstdio> #include<cstdlib> using namespace std; //初始化最大值为a[0],次大值为a[1],遍历一次,每次比较并更新最大值和次大值,最后就可以得到次大值。 这种方法时间复杂度为O(n) bool InvalidInput=false; int FindSecondMax(int a[],int n) { if(n<2||a==NULL) { return 0; InvalidInput=true; } int max=a[0]; int secondMax=a[1]; for(int i=0;i<n;i++) { if(max<a[i]) { secondMax=max;//原先的最大值变为次大值 max=a[i]; } else if(a[i]<max&&a[i]>secondMax) { secondMax=a[i]; } } if(secondMax!=max)//去重 防止出现最大值和最小值一样的情况 如a[]={3,3,3}; { return secondMax; } else { return 0; InvalidInput=true; } } //方法二先对数组排序再取倒数第二个数。最笨的就是这个方法了。时间复杂度为排序的时间复杂度 int FindSecondMax2(int a[],int n) { if(n<2||a==NULL) { return 0; InvalidInput=true; } bool flag=true; for(int i=0;i<n-1&&flag;i++) { flag=false; for(int j=0;j<n-1-i;j++) { if(a[j]>a[j+1]) { flag=true; int temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; } } } if(a[n-2]!=a[n-1]) { return a[n-2]; } else { int i=n-2; while(i>=0&&a[i]==a[n-1]) { i--; } if(i>=0) { return a[i]; } else { return 0; InvalidInput=true; } } } int main(void) { int a[] = {2,3,3,3,2,2,2}; printf("second value = %d\n",FindSecondMax2(a,sizeof(a)/sizeof(a[0]))); return 0; }
相关文章推荐
- 减脂日记-02
- JAVA笔记之数据与运算
- 关于怎么向Xcode6 IOS8之后向项目中添加预编译文件
- 使用渐进式JPG改善用户体验
- (WPF)属性值继承
- git自学
- POJ 1979---B - 广搜/深搜 基础
- a byte of vim -- 学习摘要
- Number of 1 Bits(LeetCode)
- 2015阿里、百度、360、豌豆荚、搜狗面试题部分集锦
- [java] 模拟QPS
- Apache用户认证
- 黑马程序员——第十天(
- 高手教你如何修改win7的MTU值
- php报错:Warning: Phpinfo() Has Been Disabled For Security Reasons
- UVa247 Floyd判断可达 深搜求环
- 学生成绩数组求学生排名
- js中获取触发事件对象的标签名称
- hdu2222 Keywords Search & AC自动机学习小结
- muduo::Thread类分析