一道经典的面试题,找出数组中出现半数以上的元素(不包含半数)。
先贴代码:
public int majorityElement(int[] nums) {
int result = 0,count = 0;
for(int i = 0;i < nums.length;i ++){
if(count == 0){
result = nums[i];
count ++;
}else if(result == nums[i])
count++;//因为相等,所以不用标记删除
else
count --;//将遍历到的数与前一个等于result的数标记删除
}
return result;
}
遇到此题最先想到的还是维护一个Map集合存入数组元素出现的次数。但这种解法空间复杂度较高,而且map的put和get等操作也并不花费常数时间。
以上解题方法是基于这种思想:将数组中任意两两不相等的数删除之后得到的新数组中数量过半的元素仍然不会变。由于数组的删除操作花费较多时间,可以用懒惰删除法,即认为它已经被删除。count来记录某元素出现次数,若count==0,则认为在删除过程中最大元素的候选人已经被尽数删除,此时重新给result赋值,遍历数组完毕后,仍然留下的数(因为题上表明过半元素肯定存在)即为所求元素