找出数组中的最大值和次大值
如何找出一个数组中的最大值和次大值,并且找出它们的位置。
假设只有四个数字,分成两组,前两个比较一次得出最大和次大,后两个比较一次得出最大和次大,则四个数字的最大值就是两个较大值中的最大值。而次大值就是刚才那两个比较中的较小的和另外一组的次大值比较。举个例子:1 4 3 5 。较大值4 < 较大值5,则5是最大值,然后较大值4 和另一组的次大值3 比较,得出次大值为 4。
对于n个数字的数组来说,可以使用分治递归的方法,得出左右两组中的最大值和次大值,然后利用上面的方法得出最大值和次大值。
#include<iostream> #include<vector> using namespace std; void maxAndSec(vector<int> &nums , int left , int right , int &Max , int &secMax) { if(left == right) { Max = nums[left]; secMax = INT_MIN; return; } if(left == right-1) { secMax = min(nums[right] , nums[left]); Max = max(nums[right] , nums[left]); return; } int mid = (left + right)/2; int leftMax = 0 , leftSec = 0 ; maxAndSec(nums, left , mid , leftMax , leftSec); int rightMax = 0 , rightSec = 0; maxAndSec(nums , mid+1 , right , rightMax , rightSec); Max = max(leftMax , rightMax); if(leftMax < rightMax) secMax = max(leftMax , rightSec); else secMax = max(rightMax , leftSec); } void maxAndSec2(int *nums , int len) { if(len == 0) return ; int Max = nums[0]; int secMax = INT_MIN; for(int i = 1 ; i < len ; i++) { if(nums[i] > Max) { secMax = Max; Max = nums[i]; } else { if(nums[i] > secMax) { secMax = nums[i]; } } } cout<<Max<<endl<<secMax<<endl; } int main() { int num[7] = {2,4,3,5,6,7,3}; maxAndSec2(num , 6); vector<int> nums(num , num+7); int max = 0 , secmax = 0 ; maxAndSec(nums,0,6,max,secmax); cout<<"最大值是:"<<max<<endl<<"次大值是:"<<secmax<<endl; }
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: 数据结构面试题总结1——数组:求最大、次大值
- 下一篇: C 求字符数组最大值与次大值