题目:给出一个递增数组,有正数或负数,找到其中绝对值最小的数
例如:数组{-8,-5,-1,2, 4},绝对值最小的数是-1.
思路:二分查找0
代码:
#include "stdafx.h"
#include <iostream>
#include <assert.h>
using namespace std;
//给出一个递增数组,有正数或负数,找到其中绝对值最小的数
//思路:利用二分查找0
int MinAbsNum(int nArr[], int nLength)
{
assert(nArr != NULL && nLength > 0);
int nLow = 0;
int nHigh = nLength - 1;
int nMid = 0;
while (nLow <= nHigh)
{
nMid = nLow + ((nHigh - nLow) >> 1);
if (nArr[nMid] > 0)
{
nHigh = nMid - 1;
}
else if (nArr[nMid] < 0)
{
nLow = nMid + 1;
}
else
{
return 0;
}
}
if (nLow >=0 && nLow <nLength && nHigh >=0 && nHigh < nLength)
{
int nLowAbs = abs(nArr[nLow]);
int nhighAbs = abs(nArr[nHigh]);
if (nLowAbs < nhighAbs)
{
return nArr[nLow];
}
else
{
return nArr[nHigh];
}
}
else if (nLow >=0 && nLow <nLength)
{
return nArr[nLow];
}
else
{
return nArr[nHigh];
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int nArr1[5] = {-5, -3, -1, 2, 8};//nLow、nHigh都没有越界
cout << MinAbsNum(nArr1, 5) << endl;
int nArr2[5] = {-1, -1, -1, -1, -1};//nLow越界
cout << MinAbsNum(nArr2, 5) << endl;
int nArr3[5] = {2, 2, 2, 2, 2};//nHigh越界
cout << MinAbsNum(nArr3, 5) << endl;
int nArr4[5] = {-5, -3, -1, 0, 8};
cout << MinAbsNum(nArr4, 5) << endl;
system("pause");
return 0;
}
运行结果: