求给定数组中出现次数超过一半的数:https://leetcode.com/problems/majority-element/description/
class Solution {
public:
int majorityElement(vector<int>& nums) {
sort(nums.begin(),nums.end());
return nums[nums.size()/2];
}
};
解答区给出了本问题的几种不同的解法:
1. Brute Force
穷举,用数组每个元素与后面元素比较,时间复杂度 O(n2) O ( n 2 )
2. HashMap
利用哈希图特性,存储并记录重复元素,最后找到出现次数最多的数,时间复杂度 O(n) O ( n )
3. Sorting
排序后取中间的数
4. Randomization
没看懂…代码如下:
import random
class Solution:
def majorityElement(self, nums):
majority_count = len(nums)//2
while True:
candidate = random.choice(nums)
if sum(1 for elem in nums if elem == candidate) > majority_count:
return candidate
5. Divide and Conquer
分治算法,将数组一分为二,递归分别找到前一半与后一半中的最多元素a与b,之后将出现三种情况:
*
a=b
a
=
b
:a即为众数
*
a≠b
a
≠
b
:遍历整个数组,比较a、b出现次数。
时间复杂度可以通过master theorem方法计算
6. Boyer-Moore Voting Algorithm
[7, 7, 5, 7, 5, 1 | 5, 7 | 5, 5, 7, 7 | 7, 7, 7, 7]
思想是取第一个元素作为候选数,同时初始化count变量为0。向后遍历数组,与候选数相同则
count+1
c
o
u
n
t
+
1
,不同则
count−1
c
o
u
n
t
−
1
。当count再次为0是,重新选取下一个元素作为候选数。遍历数组后,最后的候选数即为Majority Element。
class Solution:
def majorityElement(self, nums):
count = 0
candidate = None
for num in nums:
if count == 0:
candidate = num
count += (1 if num == candidate else -1)
return candidate