众数(23- 摩尔投票法)

题目描述

给定一个大小为 n 的整数数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素。
示例 1:
输入:[3,2,3]
输出:[3]

解题一

class Solution {
    
    
    public List<Integer> majorityElement(int[] nums) {
    
    
int n = nums.length;
Map<Integer,Integer> map = new HashMap<>();
List<Integer> l = new ArrayList();
for(int i= 0;i<n;i++){
    
    
 map.put(nums[i],map.getOrDefault(nums[i],0)+1);
    int temp = map.get(nums[i]);

if(temp>n/3 && !l.contains(nums[i])){
    
    
     l.add(nums[i]);
}
 }
 return l;
    }
}

摩尔投票法

摩尔投票法的核心思想为对拼消耗。

每次从序列里选择两个不相同的数字删除掉(或称为「抵消」), 最后剩下一个数字或几个相同的数字,就是出现次数大于总数一半的那个元素。
大于总数一半的数若存在则只能有一个,
大于总数1/3的数若存在只能有一个或两个。
(直接让两个不同的数火拼,最后剩下的那一个一定是大于总数一半的数——前提是这些数里面必须且一定要存在一个这样的数,否则就不正确了)

时间复杂度:O(n),其中 n 为数组的长度。
空间复杂度:O(1),只需要常数个元素用来存储关键元素和统计次数即可。

猜你喜欢

转载自blog.csdn.net/qq_51985653/article/details/120915289