【剑指offer】28:数组中出现次数超过一半的数字
题目描述:
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
解题思路:
方法一:根据数组特点,数组中有一个数字出现的次数超过数组长度的一半,也就是说它出现的次数比其他所有数字出现的次数之和还要多。我们在遍历之前设置两个值,times用来存储数字出现的次数,result存储数值。第一个for循环用来找出出现次数最多的数字(每次循环判断此时的值与result是否相同,相同则次数加1,不同则次数减一,当次数变为0的时候说明该数字不可能为多数元素,将result设置为下一个数字,次数设为1),也就是初步确定result值;第二个for循环用来判断这个result的值是否超过数组长度一半。
方法二:首先对数组进行排序,在一个有序数组中,次数超过一半的必定是中位数,那么可以直接取出中位数,然后遍历数组,看中位数是否出现次数超过一半。
代码实现:
(C语言实现方法一):
int MoreThanHalfNum_Solution(int* numbers, int numbersLen ) { // write code here int times = 1, result = numbers[0]; if (numbersLen == 0) return 0; if (numbersLen == 1) return result; for (int i = 1; i < numbersLen; i++) { if (numbers[i] == result) { times++; }else { times--; if (times == 0) { result = numbers[i]; times = 1; } } } times = 0; for (int i = 0; i < numbersLen; i++) { if (result == numbers[i]) { times++; } if (times > numbersLen / 2) { return result; } } return 0; }
(JavaScript实现方法二):
function MoreThanHalfNum_Solution(numbers) { var newArray = numbers.sort(), mid = Math.floor(newArray.length / 2), result = newArray[mid], times = 0; for (var i = 0; i < newArray.length; i++) { if (result == newArray[i]) { times++; } if (times > mid) { return result } } return 0; }