可以同时做一下力扣面试题 17.10. 主要元素
方法1:排序
因为众数必定存在,所以可以排序后,返回中间值,中间值一定是众数。
Python:
class Solution:
def majorityElement(self, nums: List[int]) -> int:
#排序
nums.sort()
return nums[len(nums) // 2]
C++:
class Solution {
public:
int majorityElement(vector<int>& nums) {
sort(nums.begin(),nums.end());
return nums[nums.size() / 2];
}
};
方法2:哈希表
先构建哈希表,key是num,value值是出现的次数,
然后再次遍历哈希表,找到众数,返回
Python:
class Solution:
def majorityElement(self, nums: List[int]) -> int:
#哈希表
hashmap = {}
for num in nums:
if num in hashmap:
hashmap[num] += 1
else:
hashmap[num] = 1
for key in hashmap:
if hashmap[key] > len(nums) // 2:
return key
C++:
class Solution {
public:
int majorityElement(vector<int>& nums) {
//哈希表
unordered_map<int,int> counts;
int res = 0,cnt = 0;
for (int num : nums){
++counts[num];
if (counts[num] > cnt){
res = num;
cnt = counts[num];
}
}
return res;
}
};
方法3:摩尔投票法:
思路:
摩尔投票算法是基于这个事实:每次从序列里选择两个不相同的数字删除掉(或称为“抵消”),最后剩下一个数字
或几个相同的数字,就是出现次数大于总数一半的那个。
设置两个变量:计数count,所求结果res
一次遍历:
如果计数等于0:
就从1开始重新计数
更新res为当前值
如果当前值等于res:#说明有重复的数,
让count + 1
否则:
让count - 1
最后返回res就是最终的结果。
Python:
class Solution:
def majorityElement(self, nums: List[int]) -> int:
# 摩尔投票法
res,count = nums[0],1
for i in range(1,len(nums)):
if count == 0:
res = nums[i]
count = 1
elif res == nums[i]:
count += 1
else:
count -= 1
return res
C++:
class Solution {
public:
int majorityElement(vector<int>& nums) {
// 摩尔投票
int candidate = nums[0],count = 1;
for(int i = 1;i < nums.size();++i){
if (count == 0){
candidate = nums[i];
count = 1;
}else if (candidate == nums[i]){
++count;
}else{
--count;
}
}
return candidate;
}
};
方法1:
时间复杂度:O(NlogN)
空间复杂度:O(1)
方法2:
时间复杂度:O(N)
空间复杂度:O(N)
方法3:
时间复杂度:O(Nl)
空间复杂度:O(1)