给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例 1:
输入: [3,2,3]
输出: 3
摩尔投票法
题干明确表示数组一定会有超过一半的数字,那么我们可以循环这个数组,已第一个数字作为众数,之后的循环中每一次遇到相同的数字,则count++,否则count--。在本题下,count永远会大于0,所以最终的众数就是我们所求的结果。
public int majorityElement(int[] nums) {
int zs =0,count =0;
for(int i=0;i<nums.length;i++){
if(count == 0){
zs = nums[i];
}
count += (zs == nums[i]) ? 1 : -1;
}
return zs;
}
- 时间复杂度:O(n) 对数组一次遍历
- 空间复杂度:O(1) 仅开辟了常量级空间
哈希映射
一次循环,将所有数字放入哈希表中。然后循环哈希表,找到出现次数最多的数字。
- 时间复杂度:O(n)
- 空间复杂度:O(n)
排序
对数组排序后, n/2 位置的数字永远是出现次数最多的数字。
- 时间复杂度:取决于使用的排序算法,快排为 O(nlogn)
- 空间复杂度:O(n)