题目描述:
给定一个整型数组,找出主元素,它在数组中的出现次数严格大于数组元素个数的二分之一。
样例
给出数组[1,1,1,1,2,2,2],返回 1
这道题属于贪心算法,解法有多种,关键是找到最优解。
最容易让人想到的解法就是遍历然后统计元素的个数,然后得出来最大的就是要找的主元素。但是这个效率低,最优的解法是将数组的元素分为两类,一类是主元素,另一类是非主元素,声明count计数变量和result,if(count == 0)则将数组[i]元素赋值给result,result元素和数组[i]值做比较,如果相等count++,否则count--,也就是把当前两个不相等的值拿走,这两个可能都是非主元素,也可能一个是主元素另一个不是,但是最终遍历结束result存储的一定是主元素的值。
时间复杂度O(N)。一次遍历就够了。
实现代码:
int selectMajorityNumber(int *a,int length){
int result = 0;
int count = 0;
for (int i = 0; i<length; i++) {
if (count == 0) {
result = a[i];
count++;
} else {
if (a[i] != result) {
count--;
} else {
count++;
}
}
}
return result;
}
int main(int argc, const char * argv[]) {
// insert code here...
std::cout << "Hello, World!\n";
int a[5] = {1,3,3,3,4};
int value = selectMajorityNumber(a, 5);
return 0;
}