数组中超过出现次数超过一半的数字
Q:题目:数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字。
A:如果将数组排序,则相同的数字肯定会在一起,因为该数字的个数超过数组长度的一半,所以该数字组成的子数组肯定会跨过数组的中间位置,所以直接返回arr[n/2]即可。不过这个方法需要先排序。
在考虑另一种方案,如果每次删除两个不同的数字,则在剩下的数组中该数字出现的次数仍然超过一半,所以就把该问题转化为一个规模更小的同类型的问题。
int FindNum(int* arr,int n) { int candidate; int cnt=0; for(int i=0;i<n;++i) { if(cnt==0) { candidate=arr[i]; cnt++; } else { if(candidate==arr[i]) cnt++; else cnt--; } } return candidate; }