剑指offer——面试题29:数组中出现次数超过一半的数字
2016-12-04 16:47
561 查看
int MoreThanHalfNum_Solution1(int* numbers, int length)
{
if(CheckInvalidArray(numbers, length))
return 0;
int middle = length >> 1;
int start = 0;
int end = length - 1;
int index = Partition(numbers, length, start, end);
while(index != middle)
{
if(index > middle)
{
end = index - 1;
index = Partition(numbers, length, start, end);
}
else
{
start = index + 1;
index = Partition(numbers, length, start, end);
}
}
int result = numbers[middle];
if(!CheckMoreThanHalf(numbers, length, result))
result = 0;
return result;
}
bool CheckInvalidArray(int* numbers, int length)
{
g_bInputInvalid = false;
if(numbers == NULL && length <= 0)
g_bInputInvalid = true;
return g_bInputInvalid;
}
bool CheckMoreThanHalf(int* numbers, int length, int number)
{
int times = 0;
for(int i = 0; i < length; ++i)
{
if(numbers[i] == number)
times++;
}
bool isMoreThanHalf = true;
if(times * 2 <= length)
{
g_bInputInvalid = true;
isMoreThanHalf = false;
}
return isMoreThanHalf;
}
int MoreThanHalfNum_Solution2(int* numbers, int length)
{
if(CheckInvalidArray(numbers, length))
return 0;
int result = numbers[0];
int times = 1;
for(int i = 1; i < length; ++i)
{
if(times == 0)
{
result = numbers[i];
times = 1;
}
else if(numbers[i] == result)
times++;
else
times--;
}
if(!CheckMoreThanHalf(numbers, length, result))
result = 0;
return result;
}
相关文章推荐
- 剑指Offer_面试题29_数组中出现次数超过一半的数字
- 剑指offer-面试题29-数组中出现次数超过一半的数字
- 《剑指offer》面试题29:数组中出现次数超过一半的数字
- (剑指Offer)面试题29:数组中出现次数超过一半的数字
- 剑指Offer面试题29(java版):数组中出现次数超过一半的数字
- 剑指Offer面试题29(java版):数组中出现次数超过一半的数字
- 剑指Offer面试题29:数组中出现次数超过一半的数字 Java实现
- 《剑指Offer》学习笔记--面试题29:数组中出现次数超过一半的数字
- 剑指offer——面试题29:数组中出现次数超过一半的数字
- 剑指offer-面试题29-数组中出现次数超过一半的数字
- 剑指offer-----面试题29(数组中出现次数超过一半的数字)
- 剑指offer 29 - 数组中出现次数超过一半的数字
- 数组中出现次数超过一半的数字(面试题 29)
- 面试题29:数组中出现次数超过一半的数字
- P163、面试题29:数组中出现次数超过一半的数字
- 面试题29:数组中出现次数超过一半的数字
- 剑指offer面试题 求数组中出现次数超过一半的数字
- 剑指offer 面试题29—数组中出现次数超过一半的数字
- 面试题29:数组中出现次数超过一半的数字
- 剑指offer-面试题29.数组中出现次数超过一半的数字