题目来自编程之美
题目:寻找数组中的最大值和最小值
要求:要求比较次数最少
分析:使用分治法解决,详细见点击打开链接
代码:
#include <iostream>
#include <assert.h>
using namespace std;
void FindMaxAndMin(int arr[],int nStart,int nEnd,int& nMax,int& nMin)
{
assert(arr != NULL && nStart <= nEnd && nStart >= 0 && nEnd >= 0);
int nLeftMax = 0;
int nLeftMin = 0;
int nRightMax = 0;
int nRightMin = 0;
if (nStart == nEnd - 1)//区间相差为1
{
if (arr[nStart] > arr[nEnd])
{
nMax = arr[nStart];
nMin = arr[nEnd];
}
else
{
nMax = arr[nEnd];
nMin = arr[nStart];
}
return;
}
if (nStart == nEnd)//区间相差为0
{
nMin = nMax = arr[nStart];
return;
}
int nMid = (nStart + nEnd)/2;
FindMaxAndMin(arr,nStart,nMid,nLeftMax,nLeftMin);
FindMaxAndMin(arr,nMid + 1,nEnd,nRightMax,nRightMin);
//分别比较两部分的最大值和最小值,求出整体的最大值和最小值
nMax = max(nLeftMax,nRightMax);
nMin = min(nLeftMin,nRightMin);
}
int main()
{
int nMin = 0;
int nMax = 0;
int arr[8] = {4,-3,5,-2,-1,2,6,-2};
FindMaxAndMin(arr,0,7,nMax,nMin);
cout<<"Max: "<<nMax<<endl;//6
cout<<"Min: "<<nMin<<endl;//-3
int arr1[8] = {4,-3,5,-11,4,-2,5,-2};
FindMaxAndMin(arr1,0,7,nMax,nMin);
cout<<"Max: "<<nMax<<endl;//5
cout<<"Min: "<<nMin<<endl;//-11
int arr2[8] = {-3,-5,-8,-2,-11,-12,-13,-1};
FindMaxAndMin(arr2,0,7,nMax,nMin);
cout<<"Max: "<<nMax<<endl;//-1
cout<<"Min: "<<nMin<<endl;//-13
system("pause");
return 1;
}
题目来自编程之美
题目:寻找数组中的最大值和次大值
要求:要求比较次数最少
分析:使用分治法解决,详细见点击打开链接
注意:如果最大值在序列中重复出现,无法找到次大值。
举例:如序列:4,-3,5,-11,4,-2,5,-2, 最大值5出现了两次,此时算法输出5和5,而不是5,4。
代码:
#include <iostream>
#include <assert.h>
using namespace std;
void FindMaxAndSecMax(int arr[],int nStart,int nEnd,int& nMax,int& nSecMax)
{
assert(arr != NULL && nStart <= nEnd && nStart >= 0 && nEnd >= 0);
int nLeftMax = 0;
int nLeftSecMax = 0;
int nRightMax = 0;
int nRightSecMax = 0;
if (nStart == nEnd - 1)//区间相差为1
{
if (arr[nStart] > arr[nEnd])
{
nMax = arr[nStart];
nSecMax = arr[nEnd];
}
else
{
nMax = arr[nEnd];
nSecMax = arr[nStart];
}
return;
}
if (nStart == nEnd)//区间相差为0
{
nSecMax = nMax = arr[nStart];
return;
}
int nMid = (nStart + nEnd)/2;
FindMaxAndSecMax(arr,nStart,nMid,nLeftMax,nLeftSecMax);
FindMaxAndSecMax(arr,nMid + 1,nEnd,nRightMax,nRightSecMax);
//分别比较两部分的最大值和次大值,求出整体的最大值和次大值
if (nLeftMax > nRightMax)
{
nMax = nLeftMax;
if (nLeftSecMax > nRightMax)
{
nSecMax = nLeftSecMax;
}
else
{
nSecMax = nRightMax;
}
}
else
{
nMax = nRightMax;
if (nRightSecMax > nLeftMax)
{
nSecMax = nRightSecMax;
}
else
{
nSecMax = nLeftMax;
}
}
}
int main()
{
int nMin = 0;
int nMax = 0;
int arr[8] = {4,-3,5,-2,-1,2,6,-2};
FindMaxAndSecMax(arr,0,7,nMax,nMin);
cout<<"Max: "<<nMax<<endl;//6
cout<<"Min: "<<nMin<<endl;//5
int arr1[8] = {4,-3,5,-11,4,-2,5,-2};
FindMaxAndSecMax(arr1,0,7,nMax,nMin);
cout<<"Max: "<<nMax<<endl;//5
cout<<"Min: "<<nMin<<endl;//5
int arr2[8] = {-3,-5,-8,-2,-11,-12,-13,-1};
FindMaxAndSecMax(arr2,0,7,nMax,nMin);
cout<<"Max: "<<nMax<<endl;//-1
cout<<"Min: "<<nMin<<endl;//-2
system("pause");
return 1;
}