剑指offer-28:数组中出现次数超过一半的数字
如果一个数大于一半,这个数最后的数量肯定大于其他所有数的数量之和,val从numbers[0]位置开始,令count等于1,val等于当前x元素,以后位置的数值和x相等,count加1,不相等则减1;当count减至0时,则换val等于下一个位置的值,需注意若出现次数最多的数的次数未超过数组长度的一半则返回0,遍历整个数组一遍,因此时间复杂度为O(n)。
具体代码如下:
class Solution {
public:
int MoreThanHalfNum_Solution(vector<int> numbers) {
int count = 0, val = -1;
for(auto x : numbers) {
if(!count){ //opps
count = 1;
val = x;
}
if(val == x) count++;
else count--;
}
int cnt = 0;
for(auto x : numbers){
if(x == val) cnt++;
}
return (2 * cnt > numbers.size() ? val : 0); //opps
}
};
本文介绍了一种在O(n)时间复杂度下找到数组中出现次数超过一半的数字的方法。通过遍历数组,利用计数器和候选值进行比较,调整计数器,最终确定过半数的元素。代码实现简洁高效。
1137

被折叠的 条评论
为什么被折叠?



