29数组中出现次数超过一半的数字

原创 2015年07月09日 16:41:40


过程:

int MoreThanHalfNum(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))
return 0;
return result;
}


bool q_bInputInvalid = false;
bool CheckInvalidArray(int* numbers, int length)
{
q_bInputInvalid = false;
if (numbers == NULL&&length <= 0)
q_bInputInvalid = true;
return q_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)
{
q_bInputInvalid = true;
isMoreThanHalf = false;
}
return isMoreThanHalf;
}


int MoreThanHalfNumber(int* numberes, 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;
}

若要求不能修改数组,则采用第二种方法。


      


相关文章推荐

面试题29_数组中出现次数超过一半的数字

题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2...

剑指offer面试题[29]-数组中出现次数超过一半的数字

题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2...

剑指offer29:数组中出现次数超过一半的数字

有两种思路: 1.最简单就是使用hashMap,循环遍历,将每个数字的值和次数作为key 和value保存到map中,最后循环遍历map,取出value,大于数组长度的一半就输出, 这样空间复杂度就...

剑指offer-面试题29-数组中出现次数超过一半的数字

题目描述:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9 的数组{ 1, 2, 3, 2, 2, 2, 5, 4, 2}。由于数字2在数组中出现了5 次,超过数组长...

29-数组中出现次数超过一半的数字

方法一:利用快排思想                 如果轴值的下标正好是n/2,那么该轴值就是中位数,如果小于,说明目标数在下标的右侧,对右侧快排,如果大于,对左侧快排。最后下标等于n/2,就是目标...

剑指offer-----面试题29(数组中出现次数超过一半的数字)

实现思路:首先如果数组中存在出现次数超过一半的数字的话,那么这个数字肯定会位于数组排序之后中间元素的右边,但是对数组排序的话,时间复杂度是O(nlogn),这道题并没有非要求我们对数组进行排序,我们只...

剑指offer 面试题29—数组中出现次数超过一半的数字

题目: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。 ...

剑指Offer面试题29数组中出现次数超过一半的数字(涉及快排)

面试题29:数组中出现次数超过一半的数字(涉及快排) 数组中有一个数字出现的次数超过数组长度的一半,输出这个数字。 思路1:先用快排把数组排好序,然后中间的那个数就是出现次数最多的,快排复杂度为O...

剑指Offer----面试题29:数组中出现次数超过一半的数字

题目: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{ 1, 2, 3, 2, 2, 2, 5, 4, 2 }。由于数字2在数组中出现了5次,超过数组长...

29 - 数组中出现次数超过一半的数字

题目描述:http://ac.jobdu.com/problem.php?pid=1370 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:29数组中出现次数超过一半的数字
举报原因:
原因补充:

(最多只允许输入30个字)