两种方法,找到具体值之后,均没有进行值得判断(是否出现次数超过一半)。
1. 中位数法
int Partition(int* pData, int begin, int end)
{
int pivot = pData[begin]; // 以第一个元素作为基准值
int left = begin;
int right = end;
while (left < right)
{
while (left < right && pData[right] >= pivot) --right; // 从右往左找第一个小于pivot的元素
while (left < right && pData[left] <= pivot) ++left; // 从左往右找以一个大于privot的的元素
if (left < right) std::swap(pData[left], pData[right]);
}
if (begin != left) std::swap(pData[begin], pData[left]); // 如果右边的元素都大于等于pivot会出现right = left = begin
return left;
}
int FindObjectData(int* pData, int size)
{
if (nullptr == pData || size < 1) return INT_MIN;
int begin = 0;
int end = size - 1;
int middle = begin + (end - begin) / 2;
int curIdx = Partition(pData, begin, end);
while (curIdx != middle)
{
if (curIdx < middle) curIdx = Partition(pData, curIdx + 1, end);
else curIdx = Partition(pData, begin, curIdx - 1);
}
return pData[middle];
}
2. 根据数组特点解法
int FindObjectData(int* pData, int size)
{
if (nullptr == pData || size < 1) return INT_MIN;
int curData = 0;
int curCount = 0;
for (int idx = 0; idx < size; ++idx)
{
if (0 == curCount) { curData = pData[idx]; ++curCount; }
else if (pData[idx] == curData) ++curCount;
else --curCount;
}
return curData;
}